Подтвердите номер телефона с помощью 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-адреса . Воспользуйтесь специализированной библиотекой .

josh3736
источник
Я согласен с тем, что регулярного выражения недостаточно для проверки телефонных номеров, потому что план нумерации телефонов действительно работает в зависимости от диапазона, например от 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

EeeeeK
источник
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;
Kennebec
источник
Это то, что я собирался предложить. Легко свежий. И слишком много проверок в любом случае может быть плохо.
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}$/
Billbad
источник
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") +
               ")$");

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

6502
источник
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");

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

действительно просто

"9001234567".match(/^\d{10}$/g)
Никита Шахов
источник
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

Для всех форматов не может быть двойных пробелов или двойных дефисов.

user2288580
источник
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);
}

joxiah025
источник
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
Maxym
источник
Не забудьте включить в свой ответ пояснения. Хотя это может сработать, важно объяснить, как и почему, чтобы получить полную и актуальную информацию. Спасибо за ответ :)
Magix