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


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

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

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

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

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

23   94   2010-12-02 21:07:16

23 ответа:

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

наконец, у меня такое чувство, что вы проверяете пользовательский ввод в веб-браузере. Помните, что проверка на стороне клиента только a удобство вы предоставляете пользователю; вам все равно нужно проверить все входные данные (снова) на сервере.

TL; DR не используйте регулярное выражение для проверка сложных реальных данных, таких как номера телефонов или URLs. Используйте специализированная библиотека.

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

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

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

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

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

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

следующее регулярное выражение будет проверять любой из этих форматов:

(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}$/

Javascript анализатор телефонных номеров с метаданными для более чем 200 стран: https://github.com/googlei18n/libphonenumber

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

где str может быть любой из этих формарт: 555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 Пять миллиардов пятьсот пятьдесят пять миллионов пятьсот пятьдесят пять тысяч пятьсот пятьдесят пять 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");

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

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

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

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

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

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

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

/^[+]?(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 International
  • 1-541-754-3010 набран в США
  • 001-541-754-3010 набран из Германии
  • 191 541 754 3010 набранный из Франции

все ответы отличные, но вот один, я думаю, немного более полный...

это написано для javascript match использование одного числа в одной строке:

^(?!.*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 = любое число).

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

это подтвердит любой номер телефона переменного формата:

\(?\d{3}\)? находит 3 цифры, заключенные в скобки или нет.

([\-\s\.])? находит любой из этих символов-разделителей или нет

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

использует первый согласованный разделитель-это гарантирует, что разделители одинаковы. Так что (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, следовательно, для двойных побегов.

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

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

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

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

до

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

Как только еще один элемент, который становится ненужным является последней черточки/пространства.

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

хотя этот пост старый, но хочу оставить свое содействие. они принимаются: Пять миллиардов пятьсот пятьдесят пять миллионов пятьсот пятьдесят пять тысяч пятьсот пятьдесят пять 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}$ Один 555)555-5555 123**&!!впрыска# Пятьдесят пять миллионов пятьсот пятьдесят пять тысяч пятьсот пятьдесят пять (6505552368) 2 (757) 622-7382 0 (757) 622-7382 -1 (757) 622-7382 2 757 622-7382 10 (757) 622-7382 Двадцать семь миллиардов пятьсот семьдесят шесть миллионов двести двадцать семь тысяч триста восемьдесят два (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");

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

$("#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;
}

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

Проверьте формат, надеюсь, что это работает :
444-555-1234
f:246.555.8888
m: 1235554567

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

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

Google имеет хорошую библиотеку для обработки телефонных номеров в Javascript:https://github.com/googlei18n/libphonenumber. работает также с Java и C++.

Я бы предпочел использовать их, потому что этот должен быть действительно хорошо протестирован в производстве. Так что это должно быть вполне безопасно для ретрансляции.

эта функция работала для нас хорошо:

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-9773207706'));

слишком много вариантов регулярных выражений для проверки номера телефона. Я рекомендую эту статью: JavaScript: HTML форма-проверка номера телефона, где для каждого случая указано несколько вариантов. Если вы хотите углубиться в выражение для пользовательского выражения, вы можете рассмотреть этот документация.

очень просто

"9001234567".match(/^\d{10}$/g)