سؤال

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

  • 1-234-567-8901
  • 1-234-567-8901x1234
  • 1-234-567-8901 داخلي 1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

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

هل كانت مفيدة؟

المحلول

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

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

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

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

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

نصائح أخرى

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

عليك أن تحدد بالضبط ما تريد.ما هي المحددات القانونية؟المسافات والشرطات والفترات؟لا يوجد محدد مسموح به؟هل يمكن مزج المحددات (على سبيل المثال، +0.111-222.3333)؟كيف سيتم التعامل مع الامتدادات (على سبيل المثال، 111-222-3333 × 44444)؟ماذا عن الأرقام الخاصة، مثل 911؟هل سيكون رمز المنطقة اختياريًا أم مطلوبًا؟

فيما يلي التعبير العادي لرقم مكون من 7 أو 10 أرقام، مع الامتدادات المسموح بها، والمحددات عبارة عن مسافات أو شرطات أو نقاط:

^(?:(?:\+?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+))?$
.*

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

سأعتبر أيضًا أيًا مما يلي إدخالات صالحة على موقع الويب:

"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"

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

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

15555555555

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

أبرز الوظائف:

  • تحليل/تنسيق/التحقق من صحة أرقام الهواتف لجميع البلدان/المناطق في العالم.
  • getNumberType - يحصل على نوع الرقم بناء على الرقم نفسه؛القدرة على التمييز بين الخطوط الثابتة والجوالة والمكالمات المجانية والأسعار المميزة والتكلفة المشتركة وVoIP والأرقام الشخصية (كلما كان ذلك ممكنًا).
  • 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 (رابط لمشروع جيثب).

إدخال رقم libphonenumber!

باستخدام أحد الأمثلة الأكثر تعقيدًا، 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 على تعليمات برمجية لـ Java وJavascript، لكن الأشخاص قاموا أيضًا بتنفيذ مكتبات للغات أخرى تستخدم مجموعة بيانات رقم هاتف Google i18n:

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

/^(?:(?:\(?(?: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

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

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";
        }
}

يحرر:

يمكنك تغيير \W* إلى \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*))?';

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

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

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

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

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

إذا كنت تريد فقط التحقق من عدم وجود قمامة عشوائية في الحقل (أي من مرسلي النماذج غير المرغوب فيها) فيجب أن يكون هذا التعبير العادي جيدًا:

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

لاحظ أنه ليس لديه أي قواعد خاصة لعدد الأرقام، أو ما هي الأرقام الصالحة في تلك الأرقام، فهو يتحقق فقط من الأرقام أو الأقواس أو الشرطات أو علامة الزائد أو المسافة أو الجنيه أو العلامة النجمية أو النقطة أو الفاصلة أو الحروف e, x, t حاضرون.

يجب أن يكون متوافقًا مع الأرقام الدولية وتنسيقات الترجمة.هل تتوقع أي حاجة للسماح بالأقواس المربعة أو المتعرجة أو الزاوية لبعض المناطق؟(حاليا لم يتم تضمينها).

إذا كنت ترغب في الحفاظ على قواعد كل رقم (كما هو الحال في رموز المناطق الأمريكية والبادئات (رموز التبادل) يجب أن تقع في نطاق 200-999)، حسنًا، حظًا سعيدًا لك.إن الحفاظ على مجموعة قواعد معقدة يمكن أن تصبح قديمة في أي وقت في المستقبل من قبل أي دولة في العالم لا يبدو أمرًا ممتعًا.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-آدم

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

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

/^\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
8800600-أبل

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

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

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

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

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

لقد كان يعمل حتى الآن مع كل ما طرحوه عليه، ولكن إذا ظهرت أخطاء، فسوف أقوم بتحديث هذه الإجابة.

التعبير العادي:

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

وظيفة PHP لاستبدال جميع أرقام الهواتف بـ tel:الروابط (في حالة أي شخص لديه فضول):

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;
}

أعتقد أن الرقم::الهاتف::الولايات المتحدة و التعبير العادي::مشترك (وخاصة مصدر التعبير العادي::مشترك::URI::RFC2806) وحدات بيرل يمكن أن تساعد.

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

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

إذا كنت تحاول التحقق من صحة إدخال المستخدم، فلماذا لا تقوم بتطبيع النتيجة والانتهاء منها؟إذا أدخل المستخدم رقمًا لا يمكنك التعرف عليه كرقم صالح، فاحفظه كرقم مُدخل أو قم بإزالة الأحرف غير القابلة للتبديل.ال الرقم::الهاتف::تطبيع يمكن أن تكون وحدة Perl مصدرًا للإلهام.

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

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

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

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

يمكن أن يكون كسر التعبير العادي المعقد مثل هذا بنفس القدر من الفعالية، ولكنه أكثر بساطة.

لقد وجدت أن هذا شيء مثير للاهتمام.لم أختبره ولكن يبدو أنه سيعمل

<?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.';
}
?>

ربما يكون من الأفضل لك استخدام "الإدخال المقنع" لهذا الغرض.وبهذه الطريقة يمكن للمستخدمين إدخال الأرقام فقط ويمكنك تنسيقها بالشكل الذي تراه مناسبًا.لست متأكدًا مما إذا كان هذا مخصصًا لتطبيق ويب، ولكن إذا كان الأمر كذلك، فهناك مكون إضافي jQuery بنقرة واحدة يوفر بعض الخيارات للقيام بذلك.

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

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

إليك واحدة تعمل بشكل جيد في JavaScript.إنها موجودة في سلسلة لأن هذا هو ما كانت تتوقعه أداة Dojo.

وهو يطابق رقم NANP بأمريكا الشمالية المكون من 10 أرقام مع امتداد اختياري.تعتبر المسافات والشرطات والفترات محددات مقبولة.

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

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

أسوأ سيناريو إذا اضطر المستخدم إلى سحب رقم غير منسق من ملف XML، فسيظل يقوم فقط بكتابة الأرقام في لوحة أرقام الهاتف 012345678x5, ، لا يوجد سبب حقيقي لإبقائها جميلة.سيظهر هذا النوع من RegEx شيئًا كهذا بالنسبة لي:

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

أميل إلى الموافقة على أن تجريد الأشياء غير الرقمية وقبول ما هو موجود هو الأفضل.ربما للتأكد من وجود رقمين على الأقل، على الرغم من أن ذلك يحظر شيئًا مثل رقم الهاتف الأبجدي "ASK-JAKE" على سبيل المثال.

قد تكون بعض تعبيرات بيرل البسيطة هي:

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

استخدم المجموعة الأولى للاحتفاظ بمجموعات الأرقام معًا، مما قد يوفر أدلة على التنسيق.استخدم الثانية لرمي جميع الأرقام غير الرقمية بشكل تافه.

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

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

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

بالنسبة لأي شخص مهتم بالقيام بشيء مماثل مع أرقام الهواتف المحمولة الأيرلندية، إليك طريقة مباشرة لتحقيق ذلك:

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 على هذا الرابط.

يحرر:

حل مسج:

    $(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();
});


});

مصدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top