regex - example - regular expression شرح




تعبير شامل شامل للتحقق من رقم الهاتف (20)

أجبت على هذا السؤال على سؤال SO آخر قبل أن تقرر تضمين جوابي كإجابة على هذا الموضوع ، لأنه لم يكن هناك أحد يخاطب كيف يتطلب / لا يتطلب عناصر ، فقط يسلم regexs: 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-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

سأجيب بمحاولتي الحالية ، لكنني أتمنى أن يكون لدى شخص ما شيئًا أفضل و / أو أكثر أناقة.


أعتقد أن Number::Phone::US و Regexp::Common (خصوصًا مصدر Regexp::Common::URI::RFC2806 ) يمكن أن تساعد وحدات Perl.

ربما ينبغي تحديد السؤال بتفاصيل أكثر بقليل لشرح الغرض من التحقق من صحة الأرقام. على سبيل المثال ، 911 هو رقم صالح في الولايات المتحدة ، ولكن 911x ليس لأي قيمة x. وذلك حتى تتمكن شركة الهاتف من حساب وقت الانتهاء من الاتصال. هناك العديد من الاختلافات حول هذه القضية. لكن تعبيرك المعتاد لا يتحقق من جزء رمز المنطقة ، لذا لا يبدو هذا مصدر قلق.

مثل التحقق من صحة عناوين البريد الإلكتروني ، حتى إذا كان لديك نتيجة صحيحة لا يمكنك معرفة ما إذا تم تعيينها لشخص ما حتى تجربتها.

إذا كنت تحاول التحقق من صحة إدخال المستخدم ، فلماذا لا تطبع النتيجة ويتم القيام بها؟ إذا وضع المستخدم رقمًا لا يمكنك التعرف عليه كرقم صالح ، فقم بحفظه على هيئة إدخال أو قطع الأحرف غير المتوفرة. يمكن أن تكون وحدة Number::Phone::Normalize Perl مصدرًا للإلهام.


أود أيضًا اقتراح libphonenumber مكتبة Google " libphonenumber ". وأنا أعلم أنه ليس regex لكنه يفعل بالضبط ما تريد.

على سبيل المثال ، سيتعرف على ما يلي:

15555555555

هو رقم محتمل ولكن ليس رقمًا صالحًا. كما يدعم البلدان خارج الولايات المتحدة.

يسلط الضوء على وظائف:

  • تحليل / تنسيق / التحقق من صحة أرقام الهواتف لجميع البلدان / مناطق العالم.
  • getNumberType - يحصل على نوع الرقم استنادًا إلى الرقم نفسه ؛ قادرة على التمييز بين الخطوط الثابتة ، والهاتف المحمول ، والرقم المجاني ، ومعدل الاشتراك الممتاز ، والتكلفة المشتركة ، وخاصية نقل الصوت عبر بروتوكول الإنترنت (VoIP) والأرقام الشخصية (كلما أمكن).
  • isNumberMatch - يحصل على مستوى الثقة حول ما إذا كان يمكن أن يكون isNumberMatch .
  • getExampleNumber / getExampleNumberByType - يوفر أرقام أمثلة صالحة لجميع البلدان / المناطق ، مع خيار تحديد نوع رقم هاتف المثال المطلوب.
  • isPossibleNumber - تخمين بسرعة ما إذا كان الرقم هو phonenumber ممكن باستخدام معلومات الطول فقط ، أسرع بكثير من التحقق الكامل.
  • isValidNumber - التحقق الكامل من رقم هاتف لمنطقة تستخدم معلومات طول وبادئة.
  • AsYouTypeFormatter - تنسيقات أرقام الهاتف على ذبابة عندما يدخل المستخدمون كل رقم.
  • findNumbers - findNumbers الأرقام في إدخال النص.
  • PhoneNumberOfflineGeocoder - يوفر معلومات جغرافية ذات صلة برقم هاتف.

أمثلة

أكبر مشكلة في التحقق من رقم الهاتف هو أنها تعتمد ثقافيا جدا.

  • أمريكا
    • (408) 974–2042 عبارة عن رقم أمريكي صالح
    • (999) 974–2042 ليس رقمًا صالحًا بالولايات المتحدة
  • أستراليا
    • 0404 999 999 هو رقم أسترالي صالح
    • (02) 9999 9999 هو أيضًا رقم أسترالي صالح
    • (09) 9999 9999 ليس رقمًا أستراليًا صالحًا

يُعد التعبير العادي أمرًا جيدًا للتحقق من تنسيق رقم الهاتف ، ولكنه لن يكون قادرًا حقًا على التحقق من صلاحية رقم الهاتف.

أقترح تخطي تعبير عادي بسيط لاختبار رقم هاتفك libphonenumber بمكتبة مثل libphonenumber Google.

تقديم libphonenumber!

باستخدام أحد الأمثلة الأكثر تعقيدًا 1-234-567-8901 x1234 ، 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 للتحقق من صحة أرقام الهواتف وعرضها.


إذا كنت تتحدث عن التحقق من صحة النموذج ، فسيكون التعقيد المنطقي للتحقق من صحة المعنى الصحيح بالإضافة إلى البيانات الصحيحة معقدًا للغاية نظرًا لاختلاف معايير البلد والمزود. سيكون من الصعب أيضا مواكبة.

أفسر السؤال على أنه يبحث عن نمط صالح بشكل عام ، والذي قد لا يكون متناسقًا داخليًا - على سبيل المثال ، وجود مجموعة صالحة من الأرقام ، ولكن ليس التحقق من صحة الخط الجذري ، أو الصرف ، إلخ ، إلى النمط الصحيح لبادئة كود البلد .

أمريكا الشمالية مباشرة ، ولأجلها الدولي ، أفضّل استخدام نمط "اصطلاحي" يغطي الطرق التي يحدد بها الناس أرقامهم ويتذكرونها:

^((((\(\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

قد يكون هذا متحيزًا لأن خبرتي تقتصر على أمريكا الشمالية وأوروبا وقليلًا من آسيا.


إليكم نمطًا رائعًا يتطابق بشكل كبير مع المصادقة التي كنت بحاجة لتحقيقها. لست مؤلفًا أصليًا ، لكنني أعتقد أنه يستحق المشاركة حيث وجدت أن هذه المشكلة معقدة جدًا وبدون إجابة موجزة أو مفيدة على نطاق واسع.

سيستخدم الشكل المعتاد التالي عددًا كبيرًا من مجموعات الأحرف وعدد الأحرف في مجموعة متنوعة من تنسيقات أرقام الهواتف العالمية:

/^\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
+79261234567
926 1234567
9261234567
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 416 555 9292

نفي:
926 3 4
8 800 600-APPLE

المصدر الأصلي: http://www.regexr.com/38pvb


إن مشاعري المعززة يعززها مقدار الردود على هذا الموضوع - وهو أن هناك عددًا لا نهائيًا من الحلول لهذه المشكلة ، لن يكون أي منها أنيقًا.

بصراحة ، أنصحك بعدم محاولة التحقق من صحة أرقام الهواتف. حتى لو كان بإمكانك كتابة مدقق شعر كبير يسمح باستخدام جميع الأشكال المشروعة المختلفة ، فسينتهي الأمر في النهاية إلى جعل أي شيء يشبه إلى حد بعيد رقم الهاتف في المقام الأول.

في رأيي ، فإن الحل الأكثر أناقة هو التحقق من طول الحد الأدنى ، لا شيء أكثر من ذلك.


خيار أفضل ... فقط قم بتجريد كل الحروف غير الموجودة على المدخلات (باستثناء "x" وعلامات "+" الرائدة) ، مع الحرص بسبب الاتجاه البريطاني لكتابة الأرقام في النموذج غير القياسي +44 (0) ... عندما يطلب منك استخدام البادئة الدولية (في هذه الحالة المحددة ، يجب عليك تجاهل (0) بالكامل).

ثم ينتهي بك الأمر بقيم مثل:

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

ثم عند عرض ، قم بإعادة تنسيق محتوى قلوبك. على سبيل المثال

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

ستواجه صعوبة في التعامل مع الأرقام الدولية باستخدام تعبير واحد / بسيط ، راجع هذا المنشور حول الصعوبات التي تواجهها أرقام الهواتف الدولية (وحتى الأمريكية الشمالية).

ستحتاج إلى تحليل الأرقام القليلة الأولى لتحديد رمز البلد ، ثم التصرف بشكل مختلف استنادًا إلى البلد.

أبعد من ذلك - القائمة التي قدمتها لا تتضمن تنسيقًا أمريكيًا شائعًا آخر - ترك الإصدار الأول. معظم الهواتف المحمولة في الولايات المتحدة لا تتطلب ذلك ، وستبدأ في حير جيل الشباب ما لم يتصلوا دوليًا.

لقد حددت بشكل صحيح أنها مشكلة صعبة ...

-Adam


كتبت أبسط (على الرغم من أنني لم أكن بحاجة إلى نقطة في ذلك).

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

كما هو مذكور أدناه ، فإنه يتحقق فقط من الأحرف ، وليس هيكلها / أمرها


لاحظ أن تجريد () الأحرف لا يعمل مع نمط كتابة الأرقام البريطانية الشائعة: +44 (0) 1234 567890 مما يعني الاتصال الهاتفي بالرقم الدولي:
+441234567890
أو في المملكة المتحدة اتصل على 01234567890


لقد وجدت هذا للعمل بشكل جيد:

^\(*\+*[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


محاولتي في تعبير غير معتاد:

/^[+#*\(\)\[\]]*([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

الأمر متروك لك لتطهيرها للعرض. بعد التحقق من ذلك يمكن أن يكون رقم رغم ذلك.


هذا هو نمط التعبير العادي البسيط لأرقام الهاتف المحمول الفلبينية:

((\+[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


هل تلقيت نظرة على RegExLib ؟

إدخال رقم الهاتف في الولايات المتحدة أعاد إلى حد كبير قائمة من الاحتمالات.


Do a replace on formatting characters, then check the remaining for phone validity. In PHP,

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

Breaking a complex regexp like this can be just as effective, but much more simple.


Here's one that works well in JavaScript. It's in a string because that's what the Dojo widget was expecting.

It matches a 10 digit North America NANP number with optional extension. Spaces, dashes and periods are accepted delimiters.

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

I was struggling with the same issue, trying to make my application future proof, but these guys got me going in the right direction. I'm not actually checking the number itself to see if it works or not, I'm just trying to make sure that a series of numbers was entered that may or may not have an extension.

Worst case scenario if the user had to pull an unformatted number from the XML file, they would still just type the numbers into the phone's numberpad 012345678x5 , no real reason to keep it pretty. That kind of RegEx would come out something like this for me:

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

My inclination is to agree that stripping non-digits and just accepting what's there is best. Maybe to ensure at least a couple digits are present, although that does prohibit something like an alphabetic phone number "ASK-JAKE" for example.

A couple simple perl expressions might be:

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

Use the first one to keep the digit groups together, which may give formatting clues. Use the second one to trivially toss all non-digits.

هل هناك قلق من احتمال وجود توقف مؤقت ثم إدخال المزيد من المفاتيح؟ أو شيء من هذا القبيل 555-1212 (انتظر الصافرة) 123؟


مثال عامل لتركيا ، مجرد تغيير

d{9}

وفقا لاحتياجاتك والبدء في استخدامه.

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}

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

يجب أن ينتهي برقم ، يمكن أن يبدأ بـ (أو + أو رقم ، وقد يحتوي على + - (أو)





phone-number