Подтвердите номер телефона с помощью JavaScript - PullRequest
115 голосов
/ 02 декабря 2010

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

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

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

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

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

Ответы [ 26 ]

111 голосов
/ 21 апреля 2015

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

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

Допустимые форматы:

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

101 голосов
/ 02 декабря 2010

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

57 голосов
/ 02 декабря 2010

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

   return value.match(/\d/g).length===10;
28 голосов
/ 02 декабря 2010

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

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);
}
27 голосов
/ 02 сентября 2011

Следующий 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}$/
22 голосов
/ 06 ноября 2015
/^[+]*[(]{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

13 голосов
/ 02 декабря 2010

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

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

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

13 голосов
/ 12 марта 2016

Где 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");
5 голосов
/ 25 октября 2017

Попробуйте этот вариант - он также включает проверку для международных форматов.

/^[+]?(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 Позвонил из Франции
5 голосов
/ 02 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...