Подтвердите номер телефона с помощью JavaScript


151

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

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

Я использую это регулярное выражение,

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

Как я могу добавить, что он также проверяет другой формат? Я плохо разбираюсь в регулярных выражениях.



5
Как показывает опыт, попытка проверки телефонных номеров обречена на неудачу. Что с разными структурами в разных странах и расширениями, это очень сложная проблема.
Квентин

1
А как насчет французской нотации, например? «12 34 56 78 90» Просто удалите все, кроме цифр (кроме, может быть, знака плюса в начале) и проверьте длину.
thejh 02

На самом деле вам не следует использовать регулярные выражения для правильной проверки телефонных номеров .
Дэн Даскалеску

Ответы:


129

Во-первых, ваш валидатор формата, очевидно, подходит только для номеров 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/… )

Ваш ответ идеален.
Криштиану Бомбазар,

159

Мое регулярное выражение выбора:

/^[\+]?[(]?[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


4
Что такое / им? Не могу найти объяснение в Google :)
Sarin Suriyakoon

7
@SarinSuriyakoon iделает выражение нечувствительным к регистру и mвыполняет многострочный поиск
Родриго Лейте

50
зачем вам нужны числа без учета регистра?
Соломон Клоссон

1
Это регулярное выражение великолепно, потому что, если вы удалите ^в начале и $в конце, оно также может найти телефонные номера в середине строк
hobberwickey 08

2
@darioxlz '123456789' не является допустимой длиной для телефонного номера
punjabi4life

68

Если вы ищете 10 и только 10 цифр, игнорируйте все, кроме цифр -

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

Это то, что я собирался предложить. Легко свежий. И слишком много проверок в любом случае может быть плохо.
mwilcox 02

1
Это лучший способ. Если вы ДЕЙСТВИТЕЛЬНО не заботитесь о том, в каком формате он находится, все, что вам нужно сделать, это убедиться, что номер частично действителен, а не треп.
mdance

8
Вы имеете в виду совпадение (/ \ d / g) не совпадение (/ \ d /) или длина будет 1, а не 10; кроме того, совпадение с пустой строкой равно нулю. По крайней мере, это должно быть var m = value.match (/ \ d / g); return m && m.length === 10
Дуг

Или , return (value.match(/\d/g) || []).length == 10или гораздо проще (но не менее испорчен) return value.replace(/\D/g,'').length == 10.
RobG

Мне нравится этот: /\D/gi.test(value). Все,
Гас

34

Я бы проигнорировал формат и проверил числовое содержимое:

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

Согласитесь с игнорированием форматирования. Например, для мобильных номеров очень часто используются пробелы, такие как XXXX XXX XXX, но для форм требуется ввод без пробелов, то есть как XXXXXXXXXX.
RobG 05

31
/^[+]*[(]{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


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

Мне кажется, что этот вариант подходит мне, поскольку он не слишком строгий и, кажется, охватывает все международные форматы (и спасибо @RemigiusStalder за исправление для Швейцарии)
Гэвин

Если у вас есть серверная часть java, вы можете добавить нормализацию номера телефона, например, из github.com/google/libphonenumber
Remigius

30

Следующий 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");


хорошее регулярное выражение, это лучший ответ на этот вопрос
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

Это будет работать:

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

Символ ?означает, что предыдущая группа должна быть сопоставлена ​​ноль или один раз. Группа (-|\s)будет соответствовать либо символу, -либо |символу. Добавление ?после второго вхождения этой группы в ваше регулярное выражение позволяет сопоставить последовательность из 10 последовательных цифр.


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


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 = любое число).


2

Этот регистр подходит для международных телефонных номеров и нескольких форматов мобильных номеров.

Вот регулярное выражение: / ^ (+ {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

/^(()?\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 Coach». Я использую регулярное выражение (()? \ D {3} ())? (- | \ s)? \ D {3} (- | \ s)? \ D {4} и целевую строку (123) 456-7890, но по какой-то причине он захватывает только последние 7 цифр. Любые идеи?
Аарон Хэтэуэй,

Да, регулярное выражение немного грубо на мозг ... и терпение. Хорошо, попробуйте / ^ [(]? (\ D {3}) [)]? [- | \ s]? (\ D {3}) [- | \ s]? (\ D {4}) $ / первая часть старого регулярного выражения не сработала: «(()? \ d {3} ())» (() средняя скобка фактически рассматривалась как часть синтаксиса регулярного выражения, а не как символы, которые нужно было искать.
Люк Веронно 02

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

Попробуйте эту функцию js. Возвращает истину , если он соответствует и ложно , если оно не реф

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


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

это не хорошо. потому что вы можете ввести сколько угодно чисел.
Мохаммад Джавад Барати,

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
m: 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

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

Вот что я использую:

// 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.