रेगेक्स का उपयोग करके फोन नंबर को कैसे मान्य करें


920

मैं फोन नंबरों को मान्य करने के लिए एक व्यापक रेगेक्स को एक साथ रखने की कोशिश कर रहा हूं। आदर्श रूप से यह अंतरराष्ट्रीय प्रारूपों को संभालता है, लेकिन इसे अमेरिकी प्रारूपों को संभालना चाहिए, जिनमें निम्न शामिल हैं:

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

मैं अपने वर्तमान प्रयास के साथ उत्तर दूंगा, लेकिन मुझे उम्मीद है कि किसी को कुछ बेहतर और / या अधिक सुरुचिपूर्ण होना चाहिए।


3
BTW, आपको निर्दिष्ट करना चाहिए कि आप किस भाषा का उपयोग कर रहे हैं। सभी रेगेक्स इंजन में एक ही वाक्यविन्यास नहीं होता है।
एंड्रयूजफोर्ड

9
लगता है कि आपने केवल 1 के बजाय +1 का विकल्प छोड़ दिया, हालांकि उत्तर इस मामले को कवर करता है।
एरिक

153
क्या सभी अमेरिकी फ़ोन नंबरों की आवश्यकता 555उनके अलावा नहीं है 911?
एंड्रयू ग्रिम

41
इसके विपरीत, 555 उपसर्ग नकली-बाहर फोन नंबरों के लिए आरक्षित है। उन नंबरों की गारंटी दी जाती है कि वे वास्तविक फोन नंबर से कनेक्ट न हों, इसलिए उनका उपयोग अक्सर टेलीविज़न और फिल्मों में किया जाता है ताकि यह सुनिश्चित किया जा सके कि एक दर्शक नंबर को कॉल करने की कोशिश न करे और कुछ गरीब निर्दोषों को परेशान करे।
भीड़

49
@rushinge जबकि यह दशकों पहले सच था, अब यह सच नहीं है । 555 उपसर्ग अभी भी विशेष है, लेकिन केवल 555-0100 से 555-0199 तक कनेक्शन के बिना संख्याओं की एक छोटी श्रृंखला को समाप्त करने की गारंटी है। लेकिन मुझे पूरा यकीन है कि एंड्रयू वैसे भी मजाक कर रहा था।
एडम डेविस

जवाबों:


515

बेहतर विकल्प ... इनपुट पर सभी गैर-अंकीय वर्णों को पट्टी करें ('x' और अग्रणी '+' चिह्नों को छोड़कर), क्योंकि ब्रिटिश प्रवृत्ति के लिए गैर-मानक रूप में संख्या लिखने के +44 (0) ...लिए अंतरराष्ट्रीय प्रवृत्ति का उपयोग करने के लिए कहा जाता है (उस विशिष्ट मामले में, आपको (0)पूरी तरह से त्याग देना चाहिए )।

फिर, आप मानों को समाप्त करते हैं जैसे:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

फिर जब आप प्रदर्शित करते हैं, तो आपके दिल की सामग्री में सुधार। जैसे

  1 (234) 567-8901
  1 (234) 567-8901 x1234

35
यदि अमेरिका के बाहर से नंबरों को आने दिया जाता है तो फ़ॉर्मेटिंग कोड समय की बर्बादी होने वाला है।
डैनियल इयरविकर

26
यह अच्छा है और सभी है, लेकिन यह मान्य नहीं है कि जो दर्ज किया गया था वह वास्तव में एक फोन नंबर था। उदाहरण के लिए, क्या होगा यदि उपयोगकर्ता अपेक्षित 10 अंकों में प्रवेश नहीं करता है? इसे अच्छे रेगेक्स सत्यापन के साथ जोड़ा जाना चाहिए।
ह्यू जेफनर

108
इस सवाल पर विचार करना सत्यापन के बारे में था - यह वास्तव में बहुत बुरा जवाब है।
PlexQ

15
@PlexQ मैं असहमत हूं। मूल समस्या फोन नंबर सत्यापन को संभालने की कोशिश कर रही है क्योंकि यह सभी संभव प्रारूपण विकल्पों को संभालने की कोशिश कर रहा था। सभी को हल करने की कोशिश करने के बजाय, इनपुट और "प्री-स्ट्रिप" को सभी फॉर्मेटिंग फ़्लॉफ़ में ले जाएं, जब तक कि आपके पास "नंबर" न हो। ऐसा करने से 2 समस्याएं हल हो जाती हैं - परिणाम का परीक्षण करना अब आसान है और अब आप यह सुनिश्चित कर सकते हैं कि प्रदर्शन के लिए प्रदान किए गए मान सभी को लगातार स्वरूपित कर सकते हैं। "शिकायतकर्ता के दस्ताने" के बारे में इस उत्तर पर पहली टिप्पणी एक अच्छा पढ़ा गया है ... कभी-कभी एक समस्या का जवाब अलग तरीके से दृष्टिकोण करना है।
scunliffe

29
कैसे इस तरह के एक अत्यधिक मतदान जवाब है? यह कुछ भी मान्य नहीं करता है । क्या बुरा है सभी अन्य फोन नंबर सत्यापन प्रश्न इस एक संदर्भ ...
jlars62

303

यह पता चला है कि इसके लिए कुछ कल्पना है, कम से कम उत्तरी अमेरिका के लिए, जिसे एनएएनपी कहा जाता है ।

आपको वही निर्दिष्ट करना होगा जो आप चाहते हैं। कानूनी अपराधी क्या हैं? रिक्त स्थान, डैश, और अवधि? कोई परिसीमन की अनुमति नहीं है? क्या कोई एक सीमांकक मिश्रण कर सकता है (उदाहरण के लिए, + 0.111-222.3333)? कैसे होते हैं एक्सटेंशन (जैसे, 111-222-3333 x 44444) को संभाला जा रहा है? 911 जैसे विशेष नंबरों का क्या? क्या क्षेत्र कोड वैकल्पिक या आवश्यक होने जा रहा है?

यहां 7 या 10 अंकों की संख्या के लिए एक regex है, जिसमें अनुमत एक्सटेंशन के साथ, सीमांकक रिक्त स्थान, डैश या अवधि हैं:

^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

7
यहां यह विस्तार अनुभाग के बिना है (मैं अपने उपयोगकर्ताओं को एक अलग क्षेत्र में प्रवेश कर रहा हूं): ^ (?:? (?:? \ +? 1 \ s * (?:? [[.-] \ _ *)?) (? : (\ s * ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9]) \ s *) | ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9])) \ s * (: [ .-] \ रों *)) ([2-9] 1 [02-9] |? [2-9] [02-9] 1 | [2-9] [02-9] {2}) \ s * (?: [[.-] \
_

18
यहाँ एक संस्करण है जो केवल 10 अंकों वाले फोन नंबरों से मेल खाता है (7 अंक नहीं 843-1212 की तरह): /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/
ब्रायन आर्मस्ट्रांग

8
क्षेत्र कोड के आसपास 10 अंकों की स्वीकार्यता (), और देश कोड के रूप में 1 से आगे बढ़ने की अनुमति नहीं है(?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})
ब्रुक।

5
@StevenSoroka मैं पिछले दो वर्षों से मेरे डेस्क पर मेरे बगल में जेफरी फ्राइडल की पुस्तक है, क्योंकि नियमित अभिव्यक्ति मेरे काम का एक प्रमुख हिस्सा है। नियमित भावों को समझने में अच्छा लगता है। कभी-कभी, इस साइट के पाठकों को केवल एक मौजूदा सॉल्यूशन की तलाश होती है, न कि अपने स्वयं के लिखने के बजाय, विशेष रूप से बहुत से कोने के मामलों वाले डोमेन में, जैसे कि फ़ोन नंबर प्रतिनिधित्व।
जस्टिन आर।

7
@ fatcat1111 मैं समझता हूं कि, लेकिन यहां अधिकांश प्रतिक्रियाएं "मुझे भी" एक प्रकार के नियमित अभिव्यक्ति के प्रकार हैं जो संभवतः आपके किसी भी कोने के मामलों में फिट नहीं होती हैं। इसके बाद मैं उन सभी वेबसाइटों पर समाप्त हो जाता हूं, जिनका मैं उपयोग करने की कोशिश कर रहा हूं और मैं अपना ज़िप कोड या फोन नंबर या ईमेल पता दर्ज नहीं कर सकता, क्योंकि किसी ने एक आधे-बेक्ड नियमित-अभिव्यक्ति का उपयोग किया (जैसे: + ईमेल पते में एक वैध चरित्र है )। इस पृष्ठ पर सबसे अच्छी प्रतिक्रियाएं उपयोगकर्ताओं को पुस्तकालयों की ओर इशारा करती हैं, न कि नैपकिन-परिमार्जित रेगेक्स की ओर।
स्टीवन सोरोका

298
.*

अगर यूजर्स आपको अपना फोन नंबर देना चाहते हैं, तो उसे सही करवाने के लिए उन पर भरोसा करें। यदि वे आपको इसे नहीं देना चाहते हैं तो उन्हें एक वैध संख्या में प्रवेश करने के लिए मजबूर करना या तो उन्हें एक प्रतियोगी की साइट पर भेज देगा या उन्हें एक यादृच्छिक स्ट्रिंग दर्ज कर देगा जो आपके रेगेक्स को फिट करता है। मैं भी एक प्रीमियम दर कुंडली हॉटलाइन की संख्या को देखने के लिए और इसके बजाय में प्रवेश करने के लिए परीक्षा हो सकती है।

मैं निम्नलिखित में से किसी एक वेब साइट पर मान्य प्रविष्टियों के रूप में भी विचार करूंगा:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"

202
मैं यहां भावना से सहमत हूं, लेकिन कभी-कभी सत्यापन करना अच्छा लगता है जब फोन नंबर वास्तव में उपयोगकर्ता के हित में कुछ महत्वपूर्ण के लिए उपयोग किया जा रहा है । यहाँ सबसे अच्छा उदाहरण एक खरीद के लिए क्रेडिट कार्ड प्राधिकरण है। यदि फ़ोन नंबर गलत है, तो विफल हो सकता है।
१।

53
यदि उपयोगकर्ता अपना फ़ोन नंबर दर्ज नहीं करना चाहता है, तो आप केवल फ़ील्ड को वैकल्पिक होने की अनुमति दे सकते हैं, लेकिन क्या उपयोगकर्ता को एक मान्य फ़ोन नंबर दर्ज करने के लिए कहने के लिए बहुत कुछ है यदि वे एक दर्ज करने जा रहे हैं?
जोएल मैकबेथ

11
इसके अलावा सत्यापन की एक भूमिका लोगों को केवल क्षेत्र कोड आदि जोड़ने के लिए याद दिलाना है जिसे वे अन्यथा जोड़ना याद नहीं कर सकते हैं, लेकिन इस तथ्य के बाद संभवतः अनुमान नहीं लगाया जा सकता है।
बेन मैकइंटायर

29
@ सूचक लेकिन regex सत्यापन आपकी मदद नहीं करेगा। फोन नंबर सही होने पर वास्तव में मान्य करने का एक और तरीका यह है कि वास्तव में इसे एक संदेश भेजें (मोबाइल के मामले में) और सुनिश्चित करें कि उपयोगकर्ता किसी प्रकार के सत्यापन कोड का उपयोग करके पुष्टि करता है। यह तब होता है जब आप नंबर सही होने पर महत्वपूर्ण होते हैं। बाकी सब कुछ केवल उपयोगकर्ता की सुविधा के लिए कुछ (लेकिन सभी नहीं) टाइपोस से बचाने के लिए है और कुछ भी मान्य नहीं करता है।
एलेक्स बी

14
ठंडा। मेरा फ़ोन नंबर 1 'या 1 = 1 - PWNED है । देखें xkcd.com/327 और owasp.org/index.php/Testing_for_SQL_Injection_(OWASP-DV-005)
हारून न्यूटन

171

मैं " libphonenumber " Google लाइब्रेरी को देखने का भी सुझाव दूंगा । मुझे पता है कि यह रेगेक्स नहीं है, लेकिन यह वही करता है जो आप चाहते हैं।

उदाहरण के लिए, यह पहचान लेगा कि:

15555555555

एक संभावित संख्या है, लेकिन एक वैध संख्या नहीं है। यह अमेरिका के बाहर के देशों का भी समर्थन करता है।

कार्यक्षमता की मुख्य विशेषताएं:

  • दुनिया के सभी देशों / क्षेत्रों के लिए फोन नंबरों को पार्स / फॉर्मेट / वेरिफाई करना।
  • getNumberType- संख्या के आधार पर संख्या का प्रकार ही प्राप्त करता है; फिक्स्ड-लाइन, मोबाइल, टोल-फ्री, प्रीमियम दर, साझा लागत, वीओआईपी और व्यक्तिगत नंबर (जब भी संभव हो) को भेद करने में सक्षम।
  • isNumberMatch - दो नंबर समान हो सकते हैं या नहीं, इस पर एक आत्मविश्वास का स्तर मिलता है।
  • getExampleNumber/ getExampleNumberByType- सभी देशों / क्षेत्रों के लिए वैध उदाहरण संख्या प्रदान करता है, यह निर्दिष्ट करने के विकल्प के साथ कि किस प्रकार के उदाहरण फोन नंबर की आवश्यकता है।
  • isPossibleNumber - जल्दी से यह अनुमान लगाते हुए कि क्या एक संख्या केवल लंबाई की जानकारी का उपयोग करके एक संभावित फोननंबर है, पूर्ण सत्यापन की तुलना में बहुत तेज है।
  • isValidNumber - लंबाई और उपसर्ग जानकारी का उपयोग कर एक क्षेत्र के लिए एक फोन नंबर की पूरी मान्यता।
  • AsYouTypeFormatter - जब उपयोगकर्ता प्रत्येक अंक दर्ज करते हैं, तो फ़ोन नंबर को फ़ॉरमेट करता है।
  • findNumbers - पाठ इनपुट में संख्या पाता है।
  • PhoneNumberOfflineGeocoder - एक फोन नंबर से संबंधित भौगोलिक जानकारी प्रदान करता है।

उदाहरण

फोन नंबर सत्यापन के साथ सबसे बड़ी समस्या यह बहुत सांस्कृतिक रूप से निर्भर है।

  • अमेरिका
    • (408) 974–2042एक वैध यूएस नंबर है
    • (999) 974–2042है कोई मान्य नहीं अमेरिका संख्या
  • ऑस्ट्रेलिया
    • 0404 999 999एक वैध ऑस्ट्रेलियाई संख्या है
    • (02) 9999 9999एक वैध ऑस्ट्रेलियाई नंबर भी है
    • (09) 9999 9999है कोई मान्य नहीं ऑस्ट्रेलियाई संख्या

फ़ोन नंबर के प्रारूप की जाँच के लिए एक नियमित अभिव्यक्ति ठीक है, लेकिन यह वास्तव में फ़ोन नंबर की वैधता की जांच करने में सक्षम नहीं है ।

मैं सुझाव दूंगा कि आप अपने फोन नंबर के खिलाफ, और Google की लाइब्रेरी libphonenumber(GitHit प्रोजेक्ट से लिंक) का उपयोग करके एक साधारण नियमित अभिव्यक्ति को छोड़ दें ।

पेश है लिबफोनेनंबर!

आपके अधिक जटिल उदाहरणों में से एक का उपयोग करते हुए 1-234-567-8901 x1234, आपको निम्न डेटा libphonenumber(ऑनलाइन डेमो से लिंक) मिलता है :

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results:

E164 format                    +12345678901
Original format                (234) 567-8901 ext. 123
National format                (234) 567-8901 ext. 123
International format           +1 234-567-8901 ext. 123
Out-of-country format from US  1 (234) 567-8901 ext. 123
Out-of-country format from CH  00 1 234-567-8901 ext. 123

तो न केवल आप सीखते हैं कि क्या फोन नंबर वैध है (जो कि यह है), लेकिन आपको अपने लोकेल में लगातार फोन नंबर फॉर्मेटिंग भी मिलती है।

एक बोनस के रूप में, libphonenumberफोन नंबर की वैधता की जांच करने के लिए कई डेटासेट हैं, साथ ही एक नंबर की जाँच जैसे कि +61299999999(अंतरराष्ट्रीय संस्करण (02) 9999 9999) फॉर्मेटिंग के साथ एक वैध संख्या के रूप में देता है:

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results

E164 format                    +61299999999
Original format                61 2 9999 9999
National format                (02) 9999 9999
International format           +61 2 9999 9999
Out-of-country format from US  011 61 2 9999 9999
Out-of-country format from CH  00 61 2 9999 9999

libphonenumber आपको कई अतिरिक्त लाभ भी प्रदान करता है, जैसे कि फ़ोन नंबर का पता लगाने के स्थान को हथियाना, और फ़ोन नंबर से समय क्षेत्र की जानकारी प्राप्त करना:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

लेकिन अवैध ऑस्ट्रेलियाई फोन नंबर ( (09) 9999 9999) यह बताता है कि यह वैध फोन नंबर नहीं है।

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Google के संस्करण में जावा और जावास्क्रिप्ट के लिए कोड है, लेकिन लोगों ने अन्य भाषाओं के लिए पुस्तकालयों को भी लागू किया है जो Google i18n नंबर नंबर का उपयोग करते हैं:

जब तक आप निश्चित नहीं होते हैं कि आप हमेशा एक स्थान से संख्याओं को स्वीकार करते जा रहे हैं, और वे हमेशा एक प्रारूप में रहने वाले हैं, तो मैं आपको इसके लिए अपना स्वयं का कोड नहीं लिखने का सुझाव दूंगा, और फोन नंबर मान्य करने और प्रदर्शित करने के लिए libphonenumber का उपयोग करने का सुझाव दूंगा।


यह देखते हुए कि अब गो पोर्ट भी है: github.com/ttacon/libphonenumber
michaelhanson

यह जाँचते हुए कि क्या यह संभव संख्या है, आपको देश कोड निर्दिष्ट करने की आवश्यकता नहीं है? मैं PHP संस्करण का उपयोग कर रहा हूं और अगर मैं एक ब्रिटिश नंबर दर्ज करता हूं जैसे (0 की जगह असली नंबर) तो 07700000000मुझे Missing or invalid default region.त्रुटि मिलती है। लेकिन अगर मैं देश कोड निर्दिष्ट करता हूं तो यह पास हो जाएगा।
बगहुंटरुका

FYI करें: यह पुस्तकालय कुछ देशों का समर्थन नहीं करता है, phpinterviewquestions.co.in/blog/ionic/…
sijo vijayan

1
@BugHunterUK (और जो कोई भी इस सवाल पर आता है और एक ही चमत्कार करता है) एक नंबर को पार्स करते समय, आप अपेक्षित क्षेत्र निर्दिष्ट कर सकते हैं, और लाइब्रेरी उस क्षेत्र में गैर-अंतर्राष्ट्रीय संख्याओं की तलाश करेगी। यदि आप निर्दिष्ट नहीं करते हैं, तो यह किसी भी मान्य अंतर्राष्ट्रीय प्रारूप में अस्वीकार नहीं करेगा।
IMSoP

Github.com/nyaruka/phonenumbers पर विचार करें क्योंकि यह लीफफोन के बजाय Google द्वारा अनुशंसित "आधिकारिक" गो पैकेज बन गया है।
डेजोन

78

/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

यह मेल खाता है:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973

$ N पर, यह बचाता है:

  1. देश का सूचक
  2. फ़ोन नंबर
  3. एक्सटेंशन

आप इसे https://www.regexpal.com/?fam=99127 पर देख सकते हैं


यह मैंने देखा सबसे व्यापक रेगेक्स था। जब तक आप हटाते हैं तब तक इसे प्राप्त करना आसान होता है ^और $अन्यथा मैं इसका उपयोग [111] [111] [1111]या 111--111--1111इसके जैसे चारों ओर प्राप्त करने में सक्षम हूं । (क्षमा करें, मेरी अंतिम टिप्पणी हटा दी गई है)
bafromca

क्या आप पुन: वाक्यांश दे सकते हैं? मैं इसे नहीं समझ सकता: "जब तक आप निकालते हैं, तब तक यह आसान हो जाता है ^ और $ या फिर मैं [111] [111] [1111] का उपयोग करके इसके चारों ओर प्राप्त करने में सक्षम हूं।" क्या इसका मतलब यह है कि यह '[111] [111] [1111]' को मान्य करता है, जब आप इसे लेते हैं ^और $?
इस्माईल मिगुएल

मैं अपने regex का उपयोग कर के आसपास हो गया [111] [111] [1111]और 111--111--1111जब तक मैं हटा दिया ^और $regex से।
bafromca

11
^ ^ ^ यह एक महान उदाहरण है कि टिप्पणी के थ्रेड्स को चैट पर क्यों नहीं जाना चाहिए। मुझे बहुत दिलचस्पी है कि यह बातचीत कैसे हुई और यह जानने की आवश्यकता है कि क्या यह ReGex मेरे ऐप में उपयोग करने के लिए पर्याप्त है। दुर्भाग्य से, चैट वार्तालाप अब चला गया है।
मैट कैसहट

1
सच कहूं तो, मैं चैट करने नहीं गया था। स्पष्टीकरण के लिए कई बार पूछने के बाद, मुझे बिना किसी जानकारी के छोड़ दिया गया। आप इसे हमेशा अपने आप को उन सभी प्रकार की संख्याओं के साथ आज़मा सकते हैं, जिन्हें आप ऑनलाइन, कई स्वरूपों में पाते हैं। एक चीज जो मैंने इसके साथ आजमाई है, वह है कई फोन नंबरों का उपयोग करना, लेकिन यह अच्छी तरह से काम नहीं करता है अगर उनके पास जगह है। और मुझे अंकों की मात्रा की गणना करने और एक विशिष्ट राशि लागू करने के लिए एक समाधान खोजना होगा।
इस्माईल मिगुएल

63

हालांकि सभी व्हाट्सएप को बंद करने का जवाब साफ-सुथरा है, लेकिन यह वास्तव में उस समस्या का समाधान नहीं करता है, जो एक rexx को खोजने के लिए है। उदाहरण के लिए, मेरी परीक्षण स्क्रिप्ट जो वेब पेज को डाउनलोड करती है और रेगेक्स का उपयोग करके सभी फोन नंबर निकालती है। चूँकि आपको वैसे भी एक regex की आवश्यकता होगी, इसलिए आप regex को सभी काम कर सकते हैं। मैं इसके साथ आया:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

यहाँ इसका परीक्षण करने के लिए एक पर्ल स्क्रिप्ट है। जब आप मिलान करते हैं, तो $ 1 में क्षेत्र कोड, $ 2 और $ 3 में फ़ोन नंबर होता है, और $ 5 में एक्सटेंशन होता है। मेरी परीक्षण स्क्रिप्ट इंटरनेट से एक फ़ाइल डाउनलोड करती है और उसमें सभी फ़ोन नंबर प्रिंट करती है।

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"1-234-567-8901",
"1-234-567-8901 x1234",
"1-234-567-8901 ext1234",
"1 (234) 567-8901",
"1.234.567.8901",
"1/234/567/8901",
"12345678901",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

संपादित करें:

आप इसे थोड़ा कसने के लिए regex में \ W * to \ s * \ W? \ S * बदल सकते हैं। जब मैंने इसे लिखा था, तो मैं एक फॉर्म पर उपयोगकर्ता इनपुट को मान्य करने के संदर्भ में रेगेक्स के बारे में नहीं सोच रहा था, लेकिन यह परिवर्तन उस उद्देश्य के लिए रेगेक्स का उपयोग करना संभव बनाता है।

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

2
FYI करें regex भी मेल खाता है: (4570457-6789जो एक बहुत ही सामान्य टाइपो होगा। मैच समूहों को भी तिरछा कर दिया जाता है: rubular.com/r/TaTP0mHL5c
SooDesuNe

@SooDesuNe Prepending (^|[^\d\n])( बहुस्तरीय ध्वज के साथ) सामान्य समस्या से बचा जाता है, यह सुनिश्चित करके कि यह तुरंत कुछ संख्यात्मक द्वारा पूर्ववर्ती नहीं है।
शहर

ध्यान दें कि यह उत्तरी अमेरिका केंद्रित है - यह "44 7911 123456"
बेन व्हीलर

43

मैंने इस प्रश्न का उत्तर एक और SO प्रश्न पर दिया, निर्णय लेने से पहले इस धागे पर एक उत्तर के रूप में मेरा उत्तर भी शामिल करें, क्योंकि किसी को यह पता नहीं था कि वस्तुओं की आवश्यकता / आवश्यकता नहीं है, बस regexs को सौंपना है: Regex गलत काम कर रहा है, अनपेक्षित चीजों का मिलान करना

उस साइट पर अपनी पोस्ट से, मैंने अपने स्वयं के वांछित फोन नंबर प्रारूप के लिए अपने स्वयं के regex बनाने के साथ किसी की सहायता करने के लिए एक त्वरित मार्गदर्शिका बनाई है, जिसे मैं चेतावनी दूंगा (जैसे मैंने दूसरी साइट पर किया था) कि यदि आप बहुत अधिक प्रतिबंधात्मक हैं, आपको वांछित परिणाम नहीं मिल सकते हैं, और दुनिया में सभी संभावित फोन नंबरों को स्वीकार करने के लिए कोई "एक आकार सभी फिट बैठता है" नहीं है - केवल आप अपनी पसंद के प्रारूप के रूप में स्वीकार करने का निर्णय लेते हैं। अपने जोखिम पार इस्तेमाल करें।

त्वरित धोखा शीट

  • अभिव्यक्ति शुरू करें: /^
  • यदि आप किसी स्थान की आवश्यकता चाहते हैं, तो उपयोग करें: [\s]या\s
  • यदि आप कोष्ठक की आवश्यकता चाहते हैं, तो उपयोग करें: [(]और [)]। उपयोग करना \(और \)बदसूरत है और चीजों को भ्रमित कर सकता है।
  • यदि आप कुछ भी वैकल्पिक करना चाहते हैं, तो ?इसके बाद रखें
  • यदि आप एक हाइफ़न चाहते हैं, तो बस टाइप करें -या [-]। यदि आप इसे अन्य पात्रों की श्रृंखला में पहले या आखिरी में नहीं डालते हैं, हालांकि, आपको इससे बचने की आवश्यकता हो सकती है: \-
  • यदि आप एक स्लॉट में विभिन्न विकल्पों को स्वीकार करना चाहते हैं, तो विकल्पों के चारों ओर कोष्ठक लगाएं: [-.\s]एक हाइफ़न, अवधि या स्थान की आवश्यकता होगी। अंतिम ब्रैकेट के बाद एक प्रश्न चिह्न उस स्लॉट के लिए उन सभी को वैकल्पिक बना देगा।
  • \d{3}: 3-अंकीय संख्या की आवश्यकता होती है: 000-999। के लिए आशुलिपि [0-9][0-9][0-9]
  • [2-9] : उस स्लॉट के लिए अंक 2-9 चाहिए।
  • (\+|1\s)?: "प्लस" या 1 और एक स्पेस (पाइप कैरेक्टर |, है "या") स्वीकार करें , और इसे वैकल्पिक बनाएं। "प्लस" चिन्ह बचना चाहिए।
  • यदि आप किसी स्लॉट से मिलान करने के लिए विशिष्ट संख्या चाहते हैं, तो उन्हें दर्ज करें: [246]2, 4 या 6 [77|78]की आवश्यकता होगी , या 77 या 78 की आवश्यकता होगी।
  • $/ : अभिव्यक्ति समाप्त करें

1
यह बहुत उपयोगी है, लेकिन मुझे संदेह है और {मिनट, अधिकतम} अभिव्यक्ति की तलाश है। क्या आप मदद कर सकते हैं?
अताबोय जोसेफ

यदि यह एक एकल अंक है जिसके बारे में हम बात कर रहे हैं (और आप इसे उसी के अनुसार मेल कर सकते हैं), उस [2-9]ब्लॉक को देखें जिसे मैंने वहाँ रखा था। इसका मतलब है कि आपका न्यूनतम 2 है, और आपका अधिकतम 9 है। तदनुसार समायोजित करें।
वाप्गुगी

30

मैंने सबसे सरल लिखा (हालाँकि मुझे इसमें डॉट की ज़रूरत नहीं थी)।

^ ([0-9 \ (\) \ / \ + \ -] *) $

जैसा कि नीचे उल्लेख किया गया है, यह केवल पात्रों के लिए जांचता है, न कि इसकी संरचना / व्यवस्था के लिए


38
यह उन संख्याओं को मान्य करता है जो तकनीकी रूप से अमान्य हैं। जैसे, "- + () (() () ()))"। नियमित अभिव्यक्तियों को पढ़ना सीखें ताकि आप समझ सकें कि आप क्या कर रहे हैं।
स्टीवन सोरोका

3
@StevenSoroka तकनीकी रूप से यह बहुत से अमान्य मामलों की अनुमति दे सकती है, लेकिन जब हम सरल संभव समाधान के साथ सामान्य गलतियों से बचने के लिए उपयोगकर्ता की मदद करने के बारे में सोचते हैं, तो यह जाने का तरीका है :)
happyhardik

2
यह भी सफेद जगह, खाली लाइन से मेल खाता है
वसीम ए।

1
@HappyHardik। वास्तव में। बुनियादी सत्यापन के लिए सरल और शक्तिशाली, उपयोगकर्ता को एक से अधिक डॉट, डैश, ब्रैकेट या प्लस टाइप करने दें।
द्विजिपि

बस इसका इस्तेमाल किया और यह कई पहलुओं में गलत है। उदाहरण के लिए, एक यूके फोन नंबर +44 के साथ शुरू हो सकता है, या इसके अंदर एक फोन नबर हो सकता है (0)। लेकिन यह आपकी नियमित अभिव्यक्ति के अनुसार मान्य नहीं है। मैं @ इस्माईल मिगुएल के जवाब की सिफारिश करूंगा। यह ठीक काम करता है और मैं आपको अपना उत्तर संशोधित करने की सलाह दूंगा।
स्टेलियोस वोस्कोस

22

यदि आप केवल यह सत्यापित करना चाहते हैं कि आपके पास फ़ील्ड में यादृच्छिक कचरा नहीं है (यानी, फॉर्म स्पैमर से) इस रेगेक्स को अच्छा निकलना चाहिए:

^[0-9+\(\)#\.\s\/ext-]+$

ध्यान दें कि इसमें कितने अंक हैं, या उन अंकों में कौन सी संख्या मान्य है, इसके लिए कोई विशेष नियम नहीं है, यह केवल सत्यापित करता है कि केवल अंक, कोष्ठक, डैश, प्लस, स्पेस, पाउंड, तारांकन, अवधि, अल्पविराम, या अक्षर e, x, tमौजूद हैं।

यह अंतरराष्ट्रीय नंबरों और स्थानीयकरण प्रारूपों के साथ संगत होना चाहिए। क्या आपको कुछ क्षेत्रों के लिए वर्ग, घुंघराले, या कोण वाले कोष्ठक की अनुमति देने की आवश्यकता है? (वर्तमान में वे शामिल नहीं हैं)।

यदि आप प्रति अंकों के नियमों को बनाए रखना चाहते हैं (जैसे कि यूएस एरिया कोड और प्रीफिक्स (एक्सचेंज कोड) 200-999 की सीमा में आते हैं) तो आपके लिए सौभाग्य की बात है। दुनिया में किसी भी देश द्वारा भविष्य में किसी भी बिंदु पर पुरानी हो सकने वाली जटिल नियम-व्यवस्था को बनाए रखना मज़ेदार नहीं लगता।

और सभी / अधिकांश गैर-संख्यात्मक वर्णों को अलग करते समय, सर्वर की ओर से अच्छा काम कर सकता है (विशेषकर यदि आप इन मानों को डायलर में पास करने की योजना बना रहे हैं), तो आप सत्यापन के दौरान उपयोगकर्ता के इनपुट को फेंकना नहीं चाहेंगे, खासकर यदि आप उन्हें चाहते हैं दूसरे क्षेत्र में सुधार करें।


22

ध्यान दें कि स्ट्रिपिंग ()कैरेक्टर यूके नंबर लिखने की शैली के लिए काम नहीं करता है: +44 (0) 1234 567890जो कि सामान्य है: जिसका अर्थ है या तो अंतर्राष्ट्रीय नंबर डायल करें:
+441234567890
या यूके डायल में01234567890


15

क्या आपने RegExLib पर एक नज़र डाली है ?

यूएस फोन नंबर दर्ज करने से संभावनाओं की एक सूची वापस आ गई।


3
यह आपके कोड में अस्पष्ट बगों को एकीकृत करने का एक शानदार तरीका दिखता है।
टॉम लॉर्ड

12

एक अप्रतिबंधित regex पर मेरा प्रयास:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

स्वीकार करता है:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

अस्वीकृत:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

यह आप पर निर्भर करता है कि वह प्रदर्शन के लिए इसे पवित्र करे। मान्य करने के बाद यह एक संख्या हो सकती है।


12

मुझे यह अच्छी तरह से काम करने के लिए मिला:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

यह इन संख्या प्रारूपों के लिए काम करता है:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050

सुनिश्चित करने के लिए वैश्विक और बहुस्तरीय झंडे का उपयोग करना सुनिश्चित करें।

लिंक: http://www.regexr.com/3bp4b


11

यदि आप फॉर्म सत्यापन के बारे में बात कर रहे हैं, तो अलग-अलग देश और प्रदाता मानकों के कारण regexp सही अर्थ के साथ-साथ सही डेटा को अत्यंत जटिल बनाने वाला है। अप टू डेट रखना भी मुश्किल होगा।

मैं एक व्यापक मान्य पैटर्न की तलाश के रूप में प्रश्न की व्याख्या करता हूं, जो आंतरिक रूप से सुसंगत नहीं हो सकता है - उदाहरण के लिए संख्याओं का एक वैध सेट है, लेकिन यह मान्य नहीं है कि ट्रंक-लाइन, विनिमय, आदि देश कोड उपसर्ग के लिए मान्य पैटर्न के लिए। ।

उत्तरी अमेरिका सीधा है, और अंतरराष्ट्रीय के लिए मैं एक 'मुहावरेदार' पैटर्न का उपयोग करना पसंद करता हूं, जिसमें उन तरीकों को शामिल किया जाता है, जिसमें लोग अपनी संख्या को निर्दिष्ट करते हैं और याद करते हैं:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

उत्तर अमेरिकी पैटर्न यह सुनिश्चित करता है कि यदि एक कोष्ठक को शामिल किया गया है तो दोनों हैं। एक वैकल्पिक प्रारंभिक '+' और देश कोड के लिए अंतर्राष्ट्रीय खाते। उसके बाद, आप मुहावरे में हैं। मान्य मैच होंगे:

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

यह पक्षपाती हो सकता है क्योंकि मेरा अनुभव उत्तरी अमेरिका, यूरोप और एशिया के एक छोटे से क्षेत्र तक सीमित है।


मैं अपनी जावास्क्रिप्ट सत्यापन स्क्रिप्ट में उपरोक्त को लागू करने की कोशिश कर रहा हूं, लेकिन मुझे एक invalid quantifierत्रुटि मिलती है। मैं गलत क्या कर रहा हूँ पर कोई विचार?
जनीस

मैं तुच्छ मामले को जोड़ूंगा जहां फोन प्रतीकों के बिना निर्दिष्ट किया जाता है, लेकिन शायद रिक्त स्थान और देश कोड, यूरोप में स्थानीय और मोबाइल नंबर के लिए विशिष्ट है: 676412342, 676 46 32 12, 676 463 212
23

11

यहां एक अद्भुत पैटर्न है जो उस मान्यता के सबसे करीब से मेल खाता है जिसे मुझे प्राप्त करने की आवश्यकता थी। मैं मूल लेखक नहीं हूं, लेकिन मुझे लगता है कि यह अच्छी तरह से साझा करने लायक है क्योंकि मुझे यह समस्या बहुत जटिल और संक्षिप्त या व्यापक रूप से उपयोगी जवाब के बिना मिली।

निम्नलिखित regex वैश्विक फोन नंबर प्रारूपों के विभिन्न प्रकारों में व्यापक रूप से उपयोग की जाने वाली संख्या और चरित्र संयोजनों को पकड़ेगा:

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

सकारात्मक:
+42 555.123.4567
+ 1- (800) -123-4567
+7 555 1234567
+7 (926) 1234567
(926) 1234567
+७९२६१२३४५६७
926 1234567
+९२६१२३४५६७
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 4,5 555 9292

नकारात्मक:
926 3 4
8 800 600-APPLE

मूल स्रोत: http://www.regexr.com/38pvb


इसमें एक्सटेंशन के लिए कुछ सीमित समर्थन है। यह "616-555-1234 x567" से मेल खाता है, लेकिन "616-555-1234 ext। 567" से नहीं।
जॉन श्नाइडर

2
उदाहरण के लिए गलत सकारात्मक "------- ((((((55555555") या "9999999999999999999999999"
माइक

यह नोरलैंड मैक्डोनाल्ड्स संख्या +31 76 596 4192 को मान्य नहीं करता है (मैं सिर्फ यादृच्छिक संख्या के लिए परीक्षण कर रहा था)
BIOHAZARD

10

इस विषय पर उत्तरों की मात्रा से मेरी आंत की भावना प्रबल होती है - कि इस समस्या के लगभग अनंत समाधान हैं, जिनमें से कोई भी सुरुचिपूर्ण नहीं है।

ईमानदारी से, मैं आपको फोन नंबरों को मान्य करने की कोशिश नहीं करने की सलाह दूंगा। यहां तक ​​कि अगर आप एक बड़े, बालों वाले सत्यापनकर्ता लिख ​​सकते हैं, जो सभी अलग-अलग वैध स्वरूपों की अनुमति देगा, तो यह बहुत अधिक कुछ भी अनुमति देगा जो दूरस्थ रूप से पहली बार में एक फोन नंबर जैसा दिखता है।

मेरी राय में, सबसे सुरुचिपूर्ण समाधान न्यूनतम लंबाई को मान्य करना है, इससे अधिक कुछ नहीं।


इनमें से एक नंबर की कोशिश करने और मौजूदा डेटा और उपयोगकर्ताओं की प्रतिक्रिया के माध्यम से जाने के बाद मैं सहमत होना चाहूंगा ...
क्रिस्टोफर किंग

कभी-कभी आपको सत्यापन करने की आवश्यकता होती है। अगर मैं पुष्टिकरण कोड भेज रहा हूं, तो मैं किसी भी यादृच्छिक कचरा को कोड नहीं भेज सकता जो एक स्पैमर के पास क्षेत्र में इनपुट है। मैं यह सुनिश्चित करना चाहता हूं कि संसाधनों को मैसेज करने से पहले नंबर शायद एक फोन नंबर हो।
ल्यूक

10

यह फिलीपीन मोबाइल फोन नंबरों के लिए एक सरल नियमित अभिव्यक्ति पैटर्न है:

((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

या

((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

इनसे मेल खाएगा:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  

पहला एक किसी भी दो अंकों के देश कोड से मेल खाएगा, जबकि दूसरा एक फिलीपीन देश के कोड से विशेष रूप से मेल खाएगा।

इसे यहाँ टेस्ट करें: http://refiddle.com/1ox


धन्यवाद। 028231234 जैसे क्षेत्र कोड वाले लैंडलाइन नंबर के बारे में कैसे? मैं सोच रहा था कि क्या क्षेत्र कोड केवल 2-3 अंकों की संख्या हैं और क्या वे हमेशा 0 से पहले हैं?
तूफान

9

यहाँ मेरा अब तक का सबसे अच्छा प्रयास है। यह ऊपर दिए गए स्वरूपों को संभालता है, लेकिन मुझे यकीन है कि मैं कुछ अन्य संभावित स्वरूपों को याद कर रहा हूं।

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$

9

आपके पास एक सिंगल / सिंपल रेगेक्स के साथ अंतर्राष्ट्रीय नंबरों से निपटने के लिए एक कठिन समय होगा, इस पोस्ट को अंतर्राष्ट्रीय (और यहां तक ​​कि उत्तर अमेरिकी) फोन नंबरों की कठिनाइयों पर देखें ।

आप देश कोड क्या है, यह निर्धारित करने के लिए पहले कुछ अंकों को पार्स करना चाहते हैं, फिर देश के आधार पर अलग-अलग कार्य करें।

इससे परे - आपके द्वारा दी गई सूची में एक और सामान्य यूएस प्रारूप शामिल नहीं है - प्रारंभिक 1. को छोड़ना। यूएस में अधिकांश सेल फोन की आवश्यकता नहीं है, और यह युवा पीढ़ी को चकित करना शुरू कर देगा, जब तक कि वे अंतरराष्ट्रीय स्तर पर डायल न करें।

आपने सही पहचाना कि यह एक मुश्किल समस्या है ...

-Adam


कोई प्रस्तावित समाधान नहीं। यह संभव है। सिर्फ इसलिए कि यह मुश्किल या जटिल है इसका मतलब यह नहीं है कि आपको सिर्फ अपनी बाहें फेंकनी चाहिए।
एरिक होडोंस्की

7

इन उत्तरों के माध्यम से पढ़ने के बाद, ऐसा लगता है कि एक सीधी नियमित अभिव्यक्ति नहीं थी जो पाठ के एक समूह के माध्यम से पार्स कर सकती है और किसी भी प्रारूप में फोन नंबर खींच सकती है (प्लस चिह्न के बिना और अंतरराष्ट्रीय सहित)।

यहां मैंने हाल ही में एक क्लाइंट प्रोजेक्ट के लिए उपयोग किया है, जहां हमें किसी भी प्रारूप में सभी फोन नंबरों को टेली: लिंक में बदलना था।

अब तक, यह उस पर फेंकी गई हर चीज के साथ काम कर रहा है, लेकिन यदि त्रुटियां आती हैं, तो मैं इस उत्तर को अपडेट करूंगा।

regex:

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

PHP फ़ंक्शन को सभी फोन नंबरों को टेल से बदलने के लिए: लिंक (यदि कोई व्यक्ति उत्सुक है):

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}

यह नियमित अभिव्यक्ति मेल खाती थी +1 1234562222222222222222222222
वर्धा एलेंट्री

सिर्फ वापस क्यों नहीं?
.xande

"99999999999999999999999999999999999999999" के लिए गलत संकेत
बेन व्हीलर

6

मेरा मानना ​​है कि नंबर :: फोन :: यूएस और रेगेक्सपी :: कॉमन (विशेषकर रेगेक्सपी का स्रोत :: कॉमन :: यूआरआई :: आरएफसी 2806 ) पर्ल मॉड्यूल मदद कर सकते हैं।

संख्याओं को मान्य करने के उद्देश्य की व्याख्या करने के लिए प्रश्न को शायद थोड़ा और विस्तार से निर्दिष्ट किया जाना चाहिए। उदाहरण के लिए, 911 अमेरिका में एक मान्य संख्या है, लेकिन 911x x के किसी भी मूल्य के लिए नहीं है। ऐसा तब है जब फोन कंपनी आपके द्वारा डायल किए जाने पर गणना कर सकती है। इस मुद्दे पर कई भिन्नताएं हैं। लेकिन आपका रेगेक्स क्षेत्र कोड भाग की जांच नहीं करता है, जिससे यह चिंता का विषय नहीं लगता है।

ईमेल पतों को मान्य करने की तरह, भले ही आपके पास कोई वैध परिणाम हो, आप यह नहीं जान सकते कि यह किसी को सौंपा गया है या नहीं।

यदि आप उपयोगकर्ता इनपुट को मान्य करने का प्रयास कर रहे हैं, तो परिणाम को सामान्य क्यों नहीं किया जाए और इसके साथ किया जाए? यदि उपयोगकर्ता एक संख्या में डालता है जिसे आप एक वैध संख्या के रूप में नहीं पहचान सकते हैं, तो इसे इनपुट के रूप में सहेजें या अनुपलब्ध वर्णों को हटा दें। संख्या :: फ़ोन :: मानक के अनुसार पर्ल मॉड्यूल प्रेरणा का एक स्रोत हो सकता है।


मैं यहां एक अंग पर जा रहा हूं और कहता हूं कि 911 को एक फोन नंबर के रूप में अनुमति देना इस रेगेक्स के लगभग सभी अनुप्रयोगों में एक बुरा विचार है। हालांकि अच्छा कैच।
निकोलस फ्लायंट

4

मैं एक बाजार अनुसंधान कंपनी के लिए काम करता हूं और हमें इस प्रकार के इनपुट को हर समय फ़िल्टर करना होगा। आप इसे बहुत अधिक जटिल कर रहे हैं। बस गैर-अल्फ़ान्यूमेरिक वर्णों को स्ट्रिप करें, और देखें कि क्या कोई एक्सटेंशन है।

आगे के विश्लेषण के लिए आप कई प्रदाताओं में से एक की सदस्यता ले सकते हैं जो आपको वैध संख्याओं के डेटाबेस तक पहुंच प्रदान करेगा और साथ ही आपको बताएगा कि क्या वे लैंडलाइन या मोबाइल हैं, डिस्कनेक्ट हो गए हैं, आदि।


मान्यता? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908) आपके प्रस्तावित समाधान से मेल खाएगा।
PlexQ

1
@PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - उपयोगकर्ताओं को सत्यापन के माध्यम से कचरा फेंकने में आविष्कारक हैं। बेहतर उन लोगों से टिक न करें जो वास्तव में अत्यधिक प्रतिबंधात्मक सत्यापन का उपयोग करके और उन्हें गलत बताते हुए कुछ अजीब डेटा रखते हैं।
प्रतिक्रियाशील

4

स्वरूपण वर्णों पर प्रतिस्थापित करें, फिर फ़ोन की वैधता के लिए शेष की जाँच करें। PHP में,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

इस तरह एक जटिल regexp को तोड़ना सिर्फ उतना ही प्रभावी हो सकता है, लेकिन बहुत अधिक सरल है।


3

मुझे यह कुछ दिलचस्प लगा। मैंने इसका परीक्षण नहीं किया है लेकिन ऐसा लगता है कि यह काम करेगा

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>

4
आपका संदेश इंगित करता है कि आपने यह कोड नहीं लिखा है। क्या आप कृपया किसी स्रोत का हवाला देते हैं?
एलिस्टेयर इरविन


3

आप शायद इसके लिए एक मास्क इनपुट का उपयोग करना बेहतर होगा। इस तरह से उपयोगकर्ता केवल संख्याएँ दर्ज कर सकते हैं और फिर भी आप फिट देख सकते हैं। मुझे यकीन नहीं है कि यह एक वेब अनुप्रयोग के लिए है, लेकिन अगर यह वहाँ है तो एक बहुत ही jQuery प्लगइन है जो ऐसा करने के लिए कुछ विकल्प प्रदान करता है।

http://digitalbush.com/projects/masked-input-plugin/

यहां तक ​​कि वे अपने ट्यूटोरियल में फोन नंबर इनपुट को कैसे मुखौटा करते हैं, इस पर भी चलते हैं।


3

यहाँ एक है जो जावास्क्रिप्ट में अच्छा काम करता है। यह एक स्ट्रिंग में है क्योंकि यही दोजो विजेट उम्मीद कर रहा था।

यह वैकल्पिक विस्तार के साथ 10 अंकों के उत्तरी अमेरिका NANP नंबर से मेल खाता है। रिक्त स्थान, डैश और अवधियों को स्वीकार किया जाता है।

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

3

मैं इसी मुद्दे से जूझ रहा था, अपने आवेदन को भविष्य का प्रमाण बनाने की कोशिश कर रहा था, लेकिन इन लोगों ने मुझे सही दिशा में जाने के लिए प्रेरित किया। मैं वास्तव में संख्या की जाँच नहीं कर रहा हूं कि यह देखने के लिए कि यह काम करता है या नहीं, मैं सिर्फ यह सुनिश्चित करने की कोशिश कर रहा हूं कि संख्याओं की एक श्रृंखला दर्ज की गई थी या इसमें विस्तार नहीं हो सकता है।

सबसे खराब स्थिति यह है कि अगर उपयोगकर्ता को एक्सएमएल फ़ाइल से एक बिना नंबर वाला नंबर खींचना होता है, तो वे अभी भी नंबर को फोन के नंबरपैड में टाइप करेंगे 012345678x5, इसे सुंदर रखने का कोई वास्तविक कारण नहीं है। इस तरह के RegEx मेरे लिए कुछ इस तरह से बाहर आ जाएगा:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

2

मेरा झुकाव इस बात पर सहमत होना है कि गैर-अंकों को अलग करना और जो सबसे अच्छा है उसे स्वीकार करना। हो सकता है कि कम से कम एक युगल अंक सुनिश्चित करने के लिए मौजूद हैं, हालांकि यह उदाहरण के लिए कुछ अक्षर फोन नंबर "ASK-JAKE" को प्रतिबंधित करता है।

एक दंपत्ति के प्रति सरल भाव हो सकते हैं:

@f = /(\d+)/g;
tr/0-9//dc;

अंक समूहों को एक साथ रखने के लिए पहले एक का उपयोग करें, जो स्वरूपण सुराग दे सकता है। सभी गैर-अंकों को तुच्छ रूप से टॉस करने के लिए दूसरे का उपयोग करें।

क्या यह चिंता है कि एक ठहराव होने की आवश्यकता हो सकती है और फिर अधिक कुंजी दर्ज की गई? या 555-1212 (बीप की प्रतीक्षा) 123 जैसी कोई चीज़?


2
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

एक अंक के साथ समाप्त होना चाहिए, (या + या एक अंक से शुरू हो सकता है, और इसमें + - (या हो सकता है)


2

आयरिश मोबाइल फोन नंबरों के साथ कुछ ऐसा ही करने के इच्छुक लोगों के लिए, इसे पूरा करने का एक सीधा तरीका है:

http://ilovenicii.com/?p=87

पीएचपी


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

उस लिंक पर एक JQuery समाधान भी है।

संपादित करें:

jQuery समाधान:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.