Підтвердьте номер телефону за допомогою JavaScript


143

Я знайшов цей код на якомусь веб-сайті, і він відмінно працює. Це підтверджує, що номер телефону знаходиться в одному з таких форматів:
(123) 456-7890 або 123-456-7890

Проблема полягає в тому, що мій клієнт (я не знаю, чому, можливо, клієнтські товари) хоче додати ще один формат, десять цифр поспіль, приблизно так: 1234567890 .

Я використовую цей регулярний вираз,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

Як додати, що він також підтверджує інший формат? Мені недобре з регулярними виразами.



5
Як правило, спроба перевірити номери телефонів приречена на провал. Що з різними структурами в різних країнах та розширеннях, це дуже складна проблема.
Квентін

1
А як щодо напр. Французьких позначень? "12 34 56 78 90" Просто видаліть усе, крім цифр (крім, можливо, знак плюс на початку) і перевірте довжину.
thejh

Ви не повинні , насправді, використовувати регулярні вирази для Validate телефонних номерів належним чином .
Дан Даскалеску

Відповіді:


123

По-перше, ваш валідатор формату, очевидно, підходить лише для номерів NANP (код країни +1). Чи буде вашою програмою користуватися хтось із номером телефону поза межами Північної Америки? Якщо так, ви не хочете заважати цим людям вводити цілком дійсний [міжнародний] номер.

По-друге, ваша перевірка невірна. Номери NANP мають вигляд, NXX NXX XXXXде Nє цифра 2-9 і Xє цифрою 0-9. Крім того, коди регіонів та обміни можуть не приймати форми N11(закінчуються двома), щоб уникнути плутанини зі спеціальними службами, за винятком того, що цифри в негеографічному коді району (800, 888, 877, 866, 855, 900) можуть мати N11обмін.

Отже, ваш регулярний вираз передасть номер (123) 123 4566, хоча це неправдивий номер телефону. Ви можете виправити це, замінивши \d{3}на [2-9]{1}\d{2}.

Нарешті, я відчуваю, що ви перевіряєте введення користувача у веб-браузері. Пам’ятайте, що перевірка на стороні клієнта - це лише зручність, яку ви надаєте користувачеві ; вам все-таки потрібно перевірити весь вхід (знову) на сервері.

TL; DR не використовують регулярний вираз для перевірки складних реальних даних, таких як телефонні номери або URL-адреси . Використовуйте спеціалізовану бібліотеку .


Я погоджуюся, що регулярного вираження недостатньо для підтвердження номерів телефонів, оскільки план нумерації телефонів насправді працює на основі діапазону, наприклад, 12300000 до 12399999 ( numberingplans.com/… )

146

Мій реджекс вибору:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Дійсні формати:

(123) 456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725


3
Що таке / ім? Не вдається знайти пояснення в google :)
Сарін Суріякоун

7
@SarinSuriyakoon iробить вираз невідчутливим до регістру і mвиконує багаторядковий пошук
Родріго Лейт

44
навіщо вам потрібні регістри для цифр?
Соломон Клоссон

1
Цей регулярний вираз чудовий тим, що якщо ви видалите ^на початку та $в кінці, він також може знайти номери телефонів посеред рядків
hobberwickey

2
@darioxlz '123456789' не є дійсною довжиною для номера телефону
punjabi4life

67

Якщо ви шукаєте 10 і лише 10 цифр, ігноруйте все, окрім цифр,

   return value.match(/\d/g).length===10;

Це те, що я збирався запропонувати. Легкий вітер. І занадто велика перевірка в будь-якому випадку може бути поганою справою.
mwilcox

1
Це найкращий шлях. Якщо ви дійсно не піклуєтесь про те, в якому форматі він знаходиться, все це переконайтеся, що число частково є дійсним, а не купою дзижчання.
mdance

7
Ви маєте на увазі збіг (/ \ d / g) не збігається (/ \ d /) або довжина буде 1, а не 10; також збіг у порожній рядку є недійсним. Принаймні, це має бути var m = value.match (/ \ d / g); повернути m&& m.length === 10
Дуг

Або , return (value.match(/\d/g) || []).length == 10або набагато простіше (але НЕ менш зіпсований) return value.replace(/\D/g,'').length == 10.
RobG

Мені подобається цей: /\D/gi.test(value). Все, що не є цифрою, включаючи пробіли, тире та інше ...
Gus

33

Що я б робив - це ігнорувати формат і перевірити числовий вміст:

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}

Погодьтесь щодо ігнорування форматування.
RobG

30
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123) 456-7890
+ (123) 456-7890
+ (123) -456-7890
+ (123) - 456-7890
+ (123) - 456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

Це дуже вільний варіант, і я вважаю за краще зберігати його таким чином, в основному я його використовую в реєстраційних формах, де користувачі повинні додати свій номер телефону. Зазвичай користувачі мають проблеми з формами, які застосовують суворі правила форматування, я вважаю за краще користувачеві заповнити номер та формат його на дисплеї або перед збереженням у базі даних. http://regexr.com/3c53v


3
Регекс трохи змінений, щоб дозволити, наприклад, для +41 (79) 123 45 67(Швейцарія):/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g
Ремігіус Сталдер,

Цей, здається, добре підходить для мене, оскільки він не надто струнний і, здається, охоплює всі міжнародні формати (і дякую @RemigiusStalder за Швейцарію)
Gavin

Якщо у вас є резервний сервер Java, ви можете додати нормалізацію номера телефону, наприклад, з github.com/google/libphonenumber
Remigius

29

Наступний REGEX підтвердить будь-який із цих форматів:

(123) 456-7890
123-456-7890
123.456.7890
1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/

3
Вам потрібно уникнути, .інакше це буде відповідати довільному символу, порушуючи ваш регулярний вираз.
Крістоф

1
Це привело мене в правильному напрямку. Дякую! На жаль, цей вираз також відповідатиме (1234567890 та 123) 4567890. ^ (((([0-9] {3})) | ([0-9] {3})) [- \ s \.]? [0-9] {3} [- \ s \.]? [0-9] {4} $ опікується цією малою проблемою.
Джо Хокінс,

15

Я б запропонував використовувати щось більш чітке (особливо думати, кому доведеться підтримувати код) ... а як щодо:

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

де побудовано регулярне вираження з чіткого шаблону? Додавання нового тоді не спричинить, і навіть сам клієнт міг би це зробити на сторінці "Параметри".


15

Де str може бути будь-яким із цих форматів: 555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");


приємне regexp, ось найкраща відповідь на це питання
JoelBonetR

9

Спробуйте це - він включає перевірку і для міжнародних форматів.

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

Цей регулярний вираз підтверджує наступний формат:

  • (541) 754-3010 Вітчизняний
  • + 1-541-754-3010 Міжнар
  • 1-541-754-3010 Набирається у США
  • 001-541-754-3010 Набраний з Німеччини
  • 191 541 754 3010 Набраний з Франції

6

/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/

Хоча ця посада стара, але хочу залишити свій внесок. їх прийнято: 5555555555 555-555-5555 (555)555-5555 1 (555) 555-5555 1 555 555 5555 1 555-555-5555 1 (555) 555-5555

вони не приймаються:

555-5555 -> прийняти це використання: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

5555555 -> прийняти це використання: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

1 555) 555-5555 123 ** & !! asdf # 55555555 (6505552368) 2 (757) 622-7382 0 (757) 622-7382 -1 (757) 622-7382 2 757 622-7382 10 (757) 622 -7382 27576227382 (275) 76227382 2 (757) 6227382 2 (757) 622-7382 (555) 5 (55?) - 5555

це код, який я використав:

function telephoneCheck(str) {
  var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
  return patt.test(str);
}

telephoneCheck("+1 555-555-5555");

Єдиною проблемою цього регулярного виразу є те, що він вважає дійсним телефонний рядок із лише одним ')' або лише одним '(' (як "(555-555-5555")
happyZZR1400

5

Це спрацює:

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

У ?символьному означає , що попередня група повинна бути збігається нуль або один раз. Група (-|\s)буде відповідати -або |символу, або символу. Додавання ?після другого виникнення цієї групи у вашому регулярному виразі дозволяє зіставити послідовність з 10 цифр поспіль.



2

Відповіді всіх чудові, але ось, я думаю, трохи більш вичерпний ...

Це написано для використання відповідності javascript в одному рядку в одному рядку:

^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$

Якщо ви хочете співставити межі слів, просто змініть ^ і $ на \ b

Я вітаю будь-які пропозиції, виправлення чи зауваження щодо цього рішення. Наскільки я можу сказати, це відповідає формату NANP (для номерів у США - я не підтверджував інші країни Північної Америки при створенні цього), уникає помилок 911 (не може бути в коді регіону чи регіоні) лише ті 555 номерів, які насправді є недійсними (код області 555 з наступним 01xx, де x = будь-яке число).


1

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

У ?символьному означає , що попередня група повинна бути збігається нуль або один раз. Група (-|\s)буде відповідати -або |символу, або символу.


1

Я повинен погодитися, що перевірка номерів телефонів - це складне завдання. Що стосується цієї конкретної проблеми, я б змінив регулярний вираз

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

до

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

як єдиний ще один елемент, який стає непотрібним, - це останній тире / пробіл.


Я дуже намагаюся підняти свою гру Regex! Я перевіряю вашу пропозицію за допомогою "Тренера Regex". Я використовую регулярний вираз (()? \ D {3} ())? (- | \ s)? \ D {3} (- | \ s)? \ D {4} і цільовий рядок (123) 456-7890, але чомусь це лише лише останні 7 цифр. Будь-які ідеї?
Аарон Хатауей

Так, регулярні виразки трохи грубі на мізки ... і терпіння. Добре спробуйте / ^ [(]? (\ D {3}) [)]? [- | \ s]? (\ D {3}) [- | \ s]? (\ D {4}) $ / the перша частина старого регексу не спрацювала добре: "(()? \ d {3} ())" (() середні дужки насправді розглядалися як частина синтаксису регулярних виразів, а не символи, які слід шукати.
Люк Веронно

1

Якщо ви використовуєте тег для введення, вам допоможе цей код. Я пишу цей код самостійно, і я вважаю, що це дуже хороший спосіб використання для введення даних. але ви можете змінити його, використовуючи свій формат. Це допоможе користувачеві виправити їх формат на тезі введення.

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input

        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });

    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}

1

Просто хотів додати рішення спеціально для вибору немісцевих номерів телефонів (800 та 900 типів).

(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}

1

Цей регістр підходить для міжнародних телефонних номерів та декількох форматів номерів мобільних стільникових.

Ось регулярний вираз: / ^ (+ {1} \ d {2,3} \ s? [(] {1} \ d {1,3} [)] {1} \ s? \ D + | + \ d {2,3} \ s {1} \ d + | \ d +) {1} [\ s | -]? \ d + ([\ s | -]? \ d +) {1,2} $ /

Ось функція JavaScript

function isValidPhone(phoneNumber) {
    var found = phoneNumber.search(/^(\+{1}\d{2,3}\s?[(]{1}\d{1,3}[)]{1}\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}$/);
    if(found > -1) {
        return true;
    }
    else {
        return false;
    }
}

Це підтверджує такі формати:

+44 07988-825 465 (з будь-яким поєднанням дефісів замість простору, за винятком того, що лише пробіл повинен відповідати +44)

+44 (0) 7988-825 465 (з будь-яким поєднанням дефісів замість пробілів, за винятком того, що жоден дефіс не може існувати безпосередньо перед або після (0), а пробіл до або після (0) не повинен існувати)

123 456-789 0123 (з будь-яким поєднанням дефісів замість пробілів)

123-123 123 (з будь-яким поєднанням дефісів замість пробілів)

123 123456 (Простір можна замінити дефісом)

1234567890

Немає подвійних пробілів або подвійних дефісів для всіх форматів.


1

Підтвердити номер телефону + повернути відформатовані дані

function validTel(str){
  str = str.replace(/[^0-9]/g, '');
  var l = str.length;
  if(l<10) return ['error', 'Tel number length < 10'];
  
  var tel = '', num = str.substr(-7),
      code = str.substr(-10, 3),
      coCode = '';
  if(l>10) {
    coCode = '+' + str.substr(0, (l-10) );
  }
  tel = coCode +' ('+ code +') '+ num;
  
  return ['succes', tel];
}

console.log(validTel('+1 [223] 123.45.67'));


1

спробуйте це

/ ^ (\ + {0,}) (\ d {0,}) ([(] {1} \ d {1,3} [)] {0,}) {0,} (\ s? \ D + | \ + \ d {2,3} \ s {1} \ d + | \ d +) {1} [\ s | -]? \ d + ([\ s | -]? \ d +) {1,2} ( \ s) {0,} $ / нім

дійсні формати

  • (123) 456-7890
  • (123)456-7890
  • 123-456-7890
  • 1234567890
  • +31636363634
  • +3 (123) 123-12-12
  • +3 (123) 123-12-12
  • +3 (123) 1231212
  • +3 (123) 12312123
  • +3 (123) 123 12 12
  • 075-63546725
  • +7910 120 54 54
  • 910 120 54 54
  • 8 999 999 99 99

https://regex101.com/r/QXAhGV/1


{1}марно, {0,}краще писати *. Навіщо використовувати всі ці групи захоплення? Вони сповільнюють процес.
Toto

це не добре. тому що ви можете ввести безліч цифр, як хочете.
mohammad jawad Barati

1

Ця функція спрацювала для нас добре:

let isPhoneNumber = input => {

  try {
    let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
      //extract numbers from string
      thenum = input.match(/[0-9]+/g).join(""),
      totalnums = thenum.length,
      last10Digits = parseInt(thenum) % 10000000000,
      ISDcode = thenum.substring(0, totalnums - 10);

    //phone numbers are generally of 8 to 16 digits
    if (totalnums >= 8 && totalnums <= 16) {
      if (ISDcode) {
        if (ISD_CODES.includes(parseInt(ISDcode))) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    }
  } catch (e) {}

  return false;
}

console.log(isPhoneNumber('91-9883208806'));


0

Просте регулярне вираження: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

Перевірте формат, сподіваємось, що він працює:
444-555-1234
f: 246.555.8888
м: 1235554567


Будь ласка, відформатуйте свою відповідь (використовуйте чотири пробіли як відступи для блоку коду). Пояснення вашого коду також підвищить його якість.
Nander Speerstra

0
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

Це підтвердить будь-який номер телефону змінного формату:

\\(?\d{3}\\)? знаходить 3 цифри, додані дужками чи ні.

([\-\s\.])? знаходить будь-якого з цих розділових символів чи ні

\d{3} знаходить 3 цифри

\1використовує перший відповідний сепаратор - це гарантує, що роздільники однакові. Тож (000) 999-5555 тут не буде підтверджено, оскільки є пробіл та роздільник тире, тому просто видаліть "\ 1" та замініть підрозділ роздільника (це також підтвердить нестандартні формати). Однак у будь-якому випадку вам слід натякнути на формат для введення користувачем.

\d{4} знаходить 4 цифри

Перевіряє:

  • (000) 999 5555
  • (000) -999-5555
  • (000) .999.5555
  • (000) 999-5555
  • (000) 9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

До речі, це для JavaScript, отже, подвійні втечі.


0

Спробуйте цю функцію js. Повертає істинне, якщо воно збігається, і помилкове, якщо воно не працює Реф

function ValidatePhoneNumber(phone) {
        return /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/.test(phone);
}


0

Просто ігноруйте все, окрім цифр.

Ось що я використовую:

// USA phones should contain at least 10 digits. For Ukrainian phones it's OK to have only 9 digits, without leading 0 and country code prefix: [+380] 88 888-88-88.
String.prototype.isValidPhone = function(digitsCount) {
  var str = this.trim().match(/\d/g);
  return str && str.length >= (digitsCount || 10); // default is at least 10 digits
}

-1

спробуйте це

/^[\+]?\d{2,}?[(]?\d{2,}[)]?[-\s\.]?\d{2,}?[-\s\.]?\d{2,}[-\s\.]?\d{0,9}$/im

дійсні формати:

  1. (123) 456-7890
  2. (123)456-7890
  3. 123-456-7890
  4. 123.456.7890
  5. 1234567890
  6. +31636363634
  7. +3 (123) 123-12-12
  8. +3 (123) 123-12-12
  9. +3 (123) 1231212
  10. +3 (123) 12312123
  11. 075-63546725

Будь ласка, обов'язково додайте пояснення до своєї відповіді. Хоча це може спрацювати, важливо пояснити, як і чому, щоб мати повну та релевантну інформацію. Дякую за відповідь :)
Magix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.