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

StackOverflow https://stackoverflow.com/questions/2113908

  •  22-09-2019
  •  | 
  •  

سؤال

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

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

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

المحلول

\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$

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

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

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

نصائح أخرى

يتم تعريف جميع رموز البلد من قبل ITU. يعتمد Regex التالي على ITU-T E.164 و الملحق لشعة ITU التشغيلية رقم 930 - 15.IV.2009. أنه يحتوي على جميع رموز ورموز البلد الحالية المخصصة للاستخدام في المستقبل. على الرغم من أنه يمكن تقصيره قليلاً ، فقد قررت تضمين كل رمز بشكل مستقل.

هذا هو للمكالمات التي نشأت من الولايات المتحدة الأمريكية. بالنسبة للبلدان الأخرى ، استبدل رمز الوصول الدولي (011 في بداية Regex) بأي شيء مناسب لهذا البلد خطة الاتصال.

لاحظ أيضًا أن ITU E.164 يحدد الحد الأقصى لرقم الهاتف الدولي الكامل إلى 15 رقمًا. هذا يعني أن رمز البلد المكون من ثلاثة أرقام ينتج عنه ما يصل إلى 12 رقمًا إضافيًا ، ويمكن أن يحتوي رمز البلد المكون من رقم واحد على ما يصل إلى 14 رقمًا إضافيًا. ومن هنا

[0-9]{0,14}$

نهاية regex.

الأهم من ذلك ، أن هذا regex لا يعني أن الرقم صالح - كل بلد يحدد خطة الترقيم الداخلية الخاصة بها. هذا يضمن فقط أن رمز البلد صالح.

^011(999|998|997|996|995|994|993|992|991| 990|979|978|977|976|975|974|973|972|971|970| 969|968|967|966|965|964|963|962|961|960|899| 898|897|896|895|894|893|892|891|890|889|888| 887|886|885|884|883|882|881|880|879|878|877| 876|875|874|873|872|871|870|859|858|857|856| 855|854|853|852|851|850|839|838|837|836|835| 834|833|832|831|830|809|808|807|806|805|804| 803|802|801|800|699|698|697|696|695|694|693| 692|691|690|689|688|687|686|685|684|683|682| 681|680|679|678|677|676|675|674|673|672|671| 670|599|598|597|596|595|594|593|592|591|590| 509|508|507|506|505|504|503|502|501|500|429| 428|427|426|425|424|423|422|421|420|389|388| 387|386|385|384|383|382|381|380|379|378|377| 376|375|374|373|372|371|370|359|358|357|356| 355|354|353|352|351|350|299|298|297|296|295| 294|293|292|291|290|289|288|287|286|285|284| 283|282|281|280|269|268|267|266|265|264|263| 262|261|260|259|258|257|256|255|254|253|252| 251|250|249|248|247|246|245|244|243|242|241| 240|239|238|237|236|235|234|233|232|231|230| 229|228|227|226|225|224|223|222|221|220|219| 218|217|216|215|214|213|212|211|210|98|95|94| 93|92|91|90|86|84|82|81|66|65|64|63|62|61|60| 58|57|56|55|54|53|52|51|49|48|47|46|45|44|43| 41|40|39|36|34|33|32|31|30|27|20|7|1)[0-9]{0, 14}$

هذا هو التحسين الإضافي.

\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$

(ط) يسمح ببادئات دولية صالحة
(2) تليها 9 أو 10 أرقام ، مع أي نوع أو وضع المحددات (باستثناء بين آخر رقمين)

هذا سوف يتطابق:
+1-234-567-8901
+61-234-567-89-01
+46-234 5678901
+1 (234) 56 89 901
+1 (234) 56-89 901
+46.234.567.8901
+1/234/567/8901

يمكنك استخدام المكتبة libphonenber من جوجل.

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
    try {
        number = phoneNumberUtil.parse(encodedHeader, null);
        decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
    } catch (NumberParseException e) {
        e.printStackTrace();
    }

أنا استخدم هذا:

/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/

المزايا: يتعرف على + أو 011 بدايات ، يتيح أن يكون طالما الحاجة ، ويتعامل مع العديد من اتفاقيات التمديد. (#، x ، تحويلة ، امتداد)

هذا سوف يعمل مع الأرقام الدولية ؛

ج#:

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

JS:

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

إليك إصدار "محسّن" من regex:

^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$

يمكنك استبدال \dS مع [0-9] إذا لم يدعم بناء جملة Regex الخاص بك \d.

ل iOS Swift لقد وجدت هذا مفيدًا ،

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"

تعبير @Eric المعتاد - أضاف قائمة بجميع رموز البلد (حصلت عليها من xxxdepy @ github. أتمنى أن تجدها مفيدة:

/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/

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

^+(؟ = d {5،15} $) (1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..) ( d+) $

نسخة بسيطة للأرقام الأوروبية ، والتي تتطابق مع أرقام مثل 0034617393211 ولكن أيضًا طويلة من 004401484172842.

^0{2}[0-9]{11,}

أتمنى أن يساعد: ·)

public static boolean validateInternationalPhoneNumberFormat(String phone) {
    StringBuilder sb = new StringBuilder(200);

    // Country code
    sb.append("^(\\+{1}[\\d]{1,3})?");

    // Area code, with or without parentheses
    sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");

    // Phone number separator can be "-", "." or " "

    // Minimum of 5 digits (for fixed line phones in Solomon Islands)
    sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");

    // 4 more optional digits
    sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");

    return Pattern.compile(sb.toString()).matcher(phone).find();
}

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

  1. يجب أن يكون الرقم الفعلي 10 أرقام فقط.
  2. بالنسبة لنا ، قد يكون رمز منطقة الأرقام محاطًا بالأقواس ().
  3. يمكن أن يكون رمز البلد من 1 إلى 3 أرقام. اختياريا قد يسبق علامة +.
  4. قد تكون هناك شرطات أو مسافات أو نقاط أو مسافات لا بين رمز البلد ورمز المنطقة وبقية الرقم.
  5. لا يمكن أن يكون رقم الهاتف صالحًا جميع الأصفار.

    ^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$
    

تفسير:

    ^ - start of expression  
    (?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.  
    (\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.  
    \(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.  
    ([. -]?) - optional space, dash or dot
    $ - end of expression

المزيد من الأمثلة والتفسير - https://regex101.com/r/hth8ct/2/

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

العرض التوضيحيhttps://libphonenber.appspot.com/

شخص سخيفhttps://github.com/googlei18n/libphonenber/releases/tag/v8.9.0

تعتمد خطة الترقيم الدولية على ITU E.164 خطة الترقيم. أعتقد أن هذه هي نقطة الانطلاق لتعبيرك المعتاد.

سأقوم بتحديث هذا إذا تمكنت من إنشاء تعبير منتظم استنادًا إلى ترقيم ITU E.164.

يعمل تعبير Regex هذا في الهند وكندا وأوروبا ونيوزيلندا وأستراليا وأرقام هواتف الولايات المتحدة ، إلى جانب رموزها البلاد:

"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"

هذا يعمل بالنسبة لي ، بدون بادئة 00 ، 001 ، 0011 إلخ على الرغم من:

/^\+*(\d{3})*[0-9,\-]{8,}/

على الرغم من أن هذا لا يستخدم REGEXP حقًا لإنجاز المهمة - أو ربما بسبب ذلك - يبدو هذا بمثابة حل جميل بالنسبة لي: https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html

جرب هذا ، إنه يعمل بالنسبة لي.

^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$

لقد استخدمت هذا أدناه:

^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$

التنسيق +ccc.nnnnnnnnxeeee أو 00ccc.nnnnnnnnxeeee

يجب أن يبدأ رقم الهاتف بـ "+" أو "00" لإجراء مكالمة دولية. حيث C هو رمز البلد 1-3 أرقام ،

N ما يصل إلى 14 رقمًا ،

و E هو التمديد (الاختياري).

مطلوب علامة Plus الرائدة ونقطة بعد رمز البلد. الحرف الحرفي "X" مطلوب فقط إذا تم توفير امتداد.

جرب هذا ، لا أعرف ما إذا كان هناك رقم هاتف أطول من 12:

^(00|\+){1}\d{12}$
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top