Regex, чтобы соответствовать нигерийским номерам телефонов [дублировать]

Начиная с jQuery 1.7, вы должны использовать jQuery.fn.on :

$(staticAncestors).on(eventName, dynamicChild, function() {});

До этого рекомендуется использовать live() :

$(selector).live( eventName, function(){} );

Однако live() устарел в 1.7 в пользу on() и полностью удален в 1.9. Подпись live():

$(selector).live( eventName, function(){} );

... может быть заменена следующей on() сигнатурой:

$(document).on( eventName, selector, function(){} );

Например, если ваша страница динамически создавала элементы с именем класса dosomething, вы привязывали бы событие к родительскому, который уже существует (здесь есть нуль проблемы, вам нужно что-то, что существует для привязки, не привязка к динамическому контенту), это может быть (и самый простой вариант) - document. Хотя иметь в виду document, возможно, не самый эффективный вариант .

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'
});

Любой родитель, который существует в момент привязки события, прекрасен. Например,

$('.buttons').on('click', 'button', function(){
    // do something here
});

применимо к

839
задан 5 revs, 5 users 65% 22 March 2017 в 17:18
поделиться

33 ответа

Лучшая опция ... просто разделите все незнаковые символы на входе (кроме знаков «x» и «впереди» +), заботясь о том, что британская тенденция писать числа в нестандартной форме +44 (0) ..., когда попросил использовать международный префикс (в этом конкретном случае вы должны полностью отбросить (0)).

Затем вы получите такие значения, как:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

Тогда, когда вы показываете, переформатируете в свои сердца. например,

  1 (234) 567-8901
  1 (234) 567-8901 x1234
482
ответ дан 3 revs, 3 users 87% 18 August 2018 в 20:26
поделиться
  • 1
    Код форматирования будет пустой тратой времени, если номера будут доступны из-за пределов США. – Daniel Earwicker 21 July 2009 в 13:13
  • 2
    Это хорошо и все, но он не подтверждает, что было введено на самом деле номер телефона. Например, что, если пользователь не вводит требуемые 10 цифр? Это должно сочетаться с хорошей проверкой регулярных выражений. – Hugh Jeffner 29 July 2010 в 14:40
  • 3
    Учитывая вопрос о валидации - это действительно очень плохой ответ. – PlexQ 30 March 2012 в 18:12
  • 4
    @PlexQ Я не согласен. Первоначальная проблема заключается в том, чтобы обрабатывать проверку номера телефона, поскольку она пыталась обрабатывать все возможные варианты форматирования. Вместо того, чтобы пытаться решить все это, возьмите вход и «предварительную полоску», это весь форматирующий пух, пока у вас не будет только «номер». Это решает две проблемы: тестирование результатов теперь легко, и теперь вы можете гарантировать, что значения, отображаемые для отображения, могут быть отформатированы последовательно. Первый комментарий к этому ответу о «Перчатках перчаток» хорошо читать ... иногда ответ на проблему заключается в том, чтобы подойти к нему по-другому. – scunliffe 30 March 2012 в 21:19
  • 5
    Как, черт возьми, это такой высокий голос? Это не проверяет все. Что еще хуже, все остальные вопросы проверки номера телефона ссылаются на этот ... – jlars62 19 June 2014 в 19:37

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

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

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

Положительный: +42 555.123.4567 + 1- (800) -123-4567 +7 555 1234567 +7 (926) 1234567 (926) 1234567 +79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 1234567 469 123 45 67 89261234567 8 (926) 1234567 926.123.4567 415-555-1234 650-555-2345 (416) 555-3456 202 555 4567 4035555678 1 416 555 9292

Отрицательный: 926 3 4 8 800 600-APPLE

Исходный источник: http://www.regexr.com / 38pvb

280
ответ дан 2 revs 18 August 2018 в 20:26
поделиться
  • 1
    здесь он не имеет расширения (я делаю, чтобы мои пользователи вводили ext в отдельном поле): ^ (?: (?: \ +? 1 \ s * (?: [.-] \ s *)?)? (? (\ S * ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9]) \ с *) | ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9])) \ S * (: [? .-] \ s *)) ([2-9] 1 [02-9] |? [2-9] [02-9] 1 | [2-9] [02-9] {2}) \ s * (?: [.-] \ S *)? ([0-9] {4}) $ – DJTripleThreat 4 May 2010 в 05:37
  • 2
    Не работал для меня. – Brian Armstrong 11 August 2010 в 20:53
  • 3
    Вот версия, которая соответствует только 10-значным номерам телефонов (не 7 цифр, например 843-1212): /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/ – Brian Armstrong 7 September 2010 в 20:32
  • 4
    10 цифр принимают () код зоны и не допускают предшествующий 1 как код страны (?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4}) – BandonRandon 9 January 2011 в 06:09
  • 5
    FYI регулярное выражение также соответствует: (4570457-6789, которое было бы довольно распространенной опечаткой. Группы матчей также перекошены: rubular.com/r/TaTP0mHL5c – SooDesuNe 20 February 2013 в 21:16
  • 6
    это подтверждает тонны чисел, которые технически недействительны. например, «- + () () ()) ())))». Научитесь читать регулярные выражения, чтобы вы могли понять, что делаете. – Steven Soroka 28 March 2013 в 16:47
  • 7
    @StevenSoroka У меня была книга Джеффри Фридла рядом со мной на моем столе в течение последних двух лет, так как регулярные выражения - большая часть моей работы. Для правильного понимания регулярных выражений требуется хорошее время. Иногда читатели этого сайта просто ищут существующий soltuion, вместо того, чтобы писать свои собственные, особенно в доменах с большим количеством угловых случаев, таких как номера телефонов. – Justin R. 28 March 2013 в 23:06
  • 8
    @ fatcat1111 Я это понимаю, но большинство ответов здесь «я тоже». тип одноразовых регулярных выражений, которые, вероятно, не подходят ни одному из ваших угловых случаев. Затем они попадают на все веб-сайты, которые я пытаюсь использовать, и я не могу ввести свой почтовый индекс, номер телефона или адрес электронной почты, потому что кто-то использовал полупеченое регулярное выражение (например: + является допустимым символом в адресах электронной почты ). Лучшие ответы на этой странице указывают пользователям на библиотеки, а не на регулярные выражения с пропиской. – Steven Soroka 5 April 2013 в 22:49
  • 9
    @StevenSoroka технически это может позволить много недействительных случаев, но когда мы думаем только о том, чтобы помочь пользователю избежать распространенных ошибок с помощью самого простого решения, это путь: – happyhardik 23 August 2013 в 19:44
  • 10
    это также соответствует пробелу, пустой строке – Wasim A. 16 September 2013 в 09:13
  • 11
    Это так неправильно. – Derek 朕會功夫 1 August 2014 в 17:47
  • 12
    У этого есть ограниченная поддержка расширений. Он соответствует «616-555-1234 x567». но не "616-555-1234 доб. 567 & Quot ;. – Jon Schneider 23 June 2016 в 21:01
  • 13
    @SooDesuNe Prepending (^|[^\d\n]) (с включенным многострочным флагом) позволяет избежать общей проблемы, гарантируя, что ей не сразу предшествует нечто числовое. – btown 23 March 2017 в 20:32
  • 14
    Не предлагаемое решение. ВОЗМОЖНО. Просто потому, что это сложно или сложно, это не значит, что вы должны просто поднять руки. – Relic 29 March 2017 в 16:14
  • 15
    Ложноположительный, например, "------- ((((((55555555" или "9999999999999999999999999" – mikep 23 November 2017 в 12:46

Я нашел это что-то интересное. Я не тестировал его, но похоже, что он будет работать

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>
22
ответ дан 2 revs, 2 users 67% 18 August 2018 в 20:26
поделиться

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

^[0-9+\(\)#\.\s\/ext-]+$

Обратите внимание, что он не имеет специальные правила для того, сколько цифр или какие числа действительны в этих цифрах, оно просто проверяет, что только цифры, скобки, тире, плюс, пробел, фунт, звездочка, период, запятая или буквы e, x, t.

Он должен быть совместим с международными номерами и форматами локализации. Предусматриваете ли вы необходимость разрешать квадратные, кудрявые или угловые скобки для некоторых регионов? (в настоящее время они не включены).

Если вы хотите поддерживать правила на каждую цифру (например, в кодах и префиксах в США (коды обмена) должны находиться в диапазоне 200-999), хорошо, хорошо удачи вам. Сохранение сложного набора правил, который может быть устаревшим в любой момент в будущем в любой стране мира, не выглядит забавным.

И хотя удаление всех / большинства нечисловых символов может хорошо работать на сервере (особенно если вы планируете передавать эти значения в дозвонщик), вы можете не захотеть вогнать вход пользователя во время проверки, особенно если вы хотите, чтобы они вносили поправки в другое поле.

18
ответ дан 2 revs, 2 users 74% 18 August 2018 в 20:26
поделиться

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

((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

или

((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

будет соответствовать этим:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  

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

Проверьте его здесь: http://refiddle.com/1ox

10
ответ дан 2 revs, 2 users 78% 18 August 2018 в 20:26
поделиться
  • 1
    Благодарю. Как насчет наземных номеров с кодом города, например 028231234? Мне интересно, являются ли коды областей только 2-3-значными числами, и им всегда предшествует 0? – stormwild 26 February 2014 в 07:41

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

Худший случай если пользователь должен был вытащить неформатированный номер из XML-файла, они все равно просто набрали числа на номерной панели телефона 012345678x5, и никаких реальных причин сохранить его довольно. Этот тип RegEx для меня выдаст что-то вроде этого:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890
3
ответ дан 3 revs, 3 users 43%Keith Wiggans 18 August 2018 в 20:26
поделиться

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

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

Северная Америка проста, а для международных я предпочитаю использовать «идиоматический» шаблон, который охватывает способы, с помощью которых люди укажите и запомните их номера:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

Североамериканский образец гарантирует, что если одна скобка включена, то и есть. Международные счета для необязательного первоначального «+» и кода страны. После этого вы находитесь в идиоме. Допустимыми совпадениями были бы:

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

Это может быть предвзятым, поскольку мой опыт ограничен Северной Америкой, Европой и небольшим количеством Азии.

11
ответ дан 3 revs, 3 users 65% 18 August 2018 в 20:26
поделиться
  • 1
    Я пытался реализовать выше в моем скрипте проверки javascript, но я продолжаю получать ошибку invalid quantifier. Любые идеи о том, что я делаю неправильно? – Jannis 17 October 2010 в 21:07
  • 2
    Я бы добавил тривиальный случай, когда телефон указан без символов, но может быть пробелы и код страны, в Европе типичен для местных и мобильных номеров: 676412342, 676 46 32 12, 676 463 212 – rupps 19 April 2015 в 23:12
.*

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

Я также рассмотрел бы любое из следующих утверждений на веб-сайте:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"
274
ответ дан 3 revs, 3 users 73% 18 August 2018 в 20:26
поделиться
  • 1
    Я согласен с этим чувством, но иногда бывает хорошо выполнить проверку, когда номер телефона действительно будет использоваться для чего-то важного в интересах пользователя . Лучший пример - авторизация кредитной карты для покупки. Если номер телефона ошибочен, аутентификация может выйти из строя. – Pointy 10 November 2010 в 19:21
  • 2
    Если пользователь не хочет вводить свой номер телефона, вы можете просто указать, что поле является необязательным, но нужно ли задавать пользователю ввести действительный номер телефона, если он собирается ввести его? – Joel McBeth 6 December 2010 в 20:41
  • 3
    Также роль проверки заключается в том, чтобы напомнить людям добавить коды областей и т. Д., Которые они, возможно, не могли бы забыть добавить, но которые невозможно угадать после этого факта. – Ben McIntyre 23 February 2011 в 01:09
  • 4
    @Pointy Но проверка регулярных выражений не поможет. Единственный способ проверить правильность номера телефона - это фактически отправить ему сообщение (в случае мобильности) И убедитесь, что пользователь подтверждает использование какого-либо кода подтверждения. Это то, что вы делаете, когда правильность числа важна. Все остальное просто для удобства пользователя для защиты от некоторых (но не всех) опечаток и ничего не подтверждает. – Alex B 16 November 2012 в 08:40
  • 5
    Круто. Мой номер телефона 1 'ИЛИ 1 = 1 - PWNED . См. xkcd.com/327 и owasp.org/index.php/Testing_for_SQL_Injection_ (OWASP-DV-005) – Aaron Newton 19 September 2013 в 09:31

Моя попытка неограниченного регулярного выражения:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

Принимает:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

Отклоняет:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

Это зависит от вас дезинфицировать его для отображения. После проверки его число было бы числом.

11
ответ дан 3 revs, 3 users 92% 18 August 2018 в 20:26
поделиться

Я ответил на этот вопрос другим вопросом SO, прежде чем принять решение включить мой ответ в качестве ответа на этот поток, потому что никто не обращался к тому, как требовать / не требовать элементов, просто выдавая регулярные выражения: Regex работает неправильно, сопоставление неожиданных вещей

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

Быстрый лист обмана

  • Запустите выражение: /^
  • Если вы хотите потребовать пробел, используйте: [\s] или \s
  • Если вы хотите скопировать скобки, используйте: [(] и [)]. Использование \( и \) является уродливым и может сбить с толку.
  • Если вы хотите, чтобы что-то было необязательным, поставьте ? после него
  • Если вы хотите дефис , просто введите - или [-]. Если вы не ставите его первым или последним в ряд других символов, вам может потребоваться его избежать: \-
  • Если вы хотите принять разные варианты в слоте, поместите скобки вокруг options: [-.\s] потребует дефис, период или пробел. Значок вопроса после последней скобки сделает все из них необязательными для этого слота.
  • \d{3}: Требуется 3-значное число: 000-999. Сокращение для [0-9][0-9][0-9].
  • [2-9]: для этого слота требуется цифра 2-9.
  • (\+|1\s)?: принять «плюс» или 1 и пробел (символ трубы, | , является «или») и делает его необязательным. Знак «плюс» должен быть экранирован.
  • Если вы хотите, чтобы определенные числа соответствовали слоту, введите их: [246] потребует 2, 4 или 6. [77|78] потребует 77 или 78 .
  • $/: Завершить выражение
39
ответ дан 5 revs 18 August 2018 в 20:26
поделиться
  • 1
    Это очень полезно, но я сомневаюсь и ищут выражение {min, max}. Вы можете помочь? – Ataboy Josef 7 January 2015 в 09:02
  • 2
    Если это одна цифра, о которой мы говорим (и вы можете сделать это в соответствии с этим), см. Блок [2-9], который я там положил. Это означает, что ваш минимум равен 2, а ваш макс - 9. Настройте соответствующим образом. – vapcguy 7 January 2015 в 22:00

/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

Это соответствует:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973

В $ n он сохраняет:

  1. Индикатор страны
  2. Номер телефона
  3. Расширение

Вы можете проверить его на https://www.regexpal.com/?fam=99127

66
ответ дан 5 revs, 4 users 73% 18 August 2018 в 20:26
поделиться
  • 1
    В каком двигателе? В Javascript и PHP работает отлично. – Ismael Miguel 7 March 2014 в 21:56
  • 2
    Это было наиболее полное регулярное выражение, которое я видел. Легко обойти, пока вы не удалите ^ и $, иначе я смогу обойти его, используя [111] [111] [1111] или 111--111--1111 и тому подобное. (извините, удалил мой последний комментарий) – bafromca 7 March 2014 в 22:10
  • 3
    Не могли бы вы перефразировать? Я не могу этого понять: «Легко получить arround, пока вы не удалите ^ и $, иначе я смогу обойти его, используя [111] [111] [1111]». Означает ли это, что он проверяет «[111] [111] [1111]», когда вы берете ^ и $? – Ismael Miguel 7 March 2014 в 22:13
  • 4
    ^^^ Это отличный пример того, почему потоки комментариев НЕ должны идти в чат. Мне очень интересно, как получился этот разговор, и нужно знать, достаточно ли этот ReGex для использования в моем приложении. К сожалению, чат-разговор ушел. – Matt Cashatt 18 July 2014 в 17:53
  • 5
    Честно говоря, я не пошел в чат. Прося несколько раз для объяснений, у меня не было информации. Вы всегда можете попробовать самостоятельно со всеми типами номеров, которые вы найдете в Интернете, в нескольких форматах. Одна вещь, которую я пробовал с этим, - использовать несколько телефонных номеров, но она не работает так хорошо, если у них есть пробелы. И я должен найти решение, чтобы подсчитать количество цифр и обеспечить определенную сумму. – Ismael Miguel 19 July 2014 в 19:09

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

Например, он распознает, что:

15555555555

- это возможное число, но не действительное число. Он также поддерживает страны за пределами США.

Основные функции:

  • Разбор / форматирование / подтверждение номеров телефонов для всех стран / регионов мира.
  • getNumberType - получает тип числа, основанного на самом номере;
  • isNumberMatch - получает уровень уверенности в том, могут ли два числа быть
  • getExampleNumber / getExampleNumberByType - предоставляет действительные номера примеров для всех стран / регионов, с возможностью указать, какой тип номера номера телефона необходим.
  • isPossibleNumber - быстро угадывая, является ли число возможным номером звонка, используя только информацию о длине, намного быстрее, чем полная проверка.
  • isValidNumber - полная проверка номера телефона для региона с использованием информации о длине и префиксе .
  • AsYouTypeFormatter - форматирует номера телефонов «на лету», когда пользователи вводят каждую цифру.
  • findNumbers - находит номера в текстовом вводе.
  • PhoneNumberOfflineGeocoder - предоставляет географическую информацию, относящуюся к номеру телефона.

Примеры

Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.

  • America (408) 974–2042 является действительным Номер в США (999) 974–2042 не является допустимым номером в США
  • Австралия 0404 999 999 является действительным австралийским номером (02) 9999 9999, также является действительным австралийским номером (09) 9999 9999, не является действительным австралийским номером

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

Я бы предложил пропустить простое регулярное выражение, чтобы проверить ваш номер телефона, и использовать библиотеку, такую ​​как libphonenumber Google [ссылка на проект GitHub] .

Представляем libphonenumber!

Используя один из ваших более сложных примеров, 1-234-567-8901 x1234, вы получаете следующие данные из libphonenumber (ссылка на онлайн-демонстрацию) :

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results:

E164 format                    +12345678901
Original format                (234) 567-8901 ext. 123
National format                (234) 567-8901 ext. 123
International format           +1 234-567-8901 ext. 123
Out-of-country format from US  1 (234) 567-8901 ext. 123
Out-of-country format from CH  00 1 234-567-8901 ext. 123

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

В качестве бонуса, libphonenumber имеет ряд наборов данных для проверки правильности номеров телефонов, поэтому, проверяя число, например +61299999999 (международная версия (02) 9999 9999 ) возвращает в качестве допустимого числа с форматированием:

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results

E164 format                    +61299999999
Original format                61 2 9999 9999
National format                (02) 9999 9999
International format           +61 2 9999 9999
Out-of-country format from US  011 61 2 9999 9999
Out-of-country format from CH  00 61 2 9999 9999

libphonenumber также дает вам много дополнительных преимуществ, таких как захват местоположения, в котором обнаружен номер телефона, а также получить информацию о часовом поясе с номера телефона:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

Но неверный номер австралийского телефона ( (09) 9999 9999 ) показывает, что он не является действительным номером телефона.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Версия Google имеет код для Java и Javascript, но люди также реализовали библиотеки для других языков, которые используют набор данных телефона i18n для Google:

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

130
ответ дан 7 revs, 6 users 64% 18 August 2018 в 20:26
поделиться
  • 1
    Отметив, что теперь есть порт Go по адресу: github.com/ttacon/libphonenumber – michaelhanson 12 September 2016 в 18:59
  • 2
    Когда вы проверяете, есть ли возможный номер, вам не нужно указывать код страны? Я использую версию PHP, и если я вхожу в британское число вроде (замените 0 на реальные числа) 07700000000 Я получаю ошибку Missing or invalid default region.. Но если я укажу код страны, он пройдет. – BugHunterUK 29 November 2016 в 00:22
  • 3
    FYI: эта библиотека не поддерживает некоторые страны, phpinterviewquestions.co.in/blog/ionic/… – sijo vijayan 22 July 2017 в 08:26
  • 4
    @BugHunterUK (и любой, кто сталкивается с этим вопросом и интересуется тем же) при разборе номера, вы можете указать ожидаемый регион, и библиотека будет искать не-международные номера в этом регионе. Если вы не укажете, он отклонит что-либо не в действительном международном формате. – IMSoP 22 March 2018 в 17:56
  • 5
    – user230910 9 October 2018 в 02:09

Вам, вероятно, было бы лучше использовать Masked Input для этого. Таким образом, пользователи могут ТОЛЬКО вводить цифры, и вы можете форматировать, как вы считаете нужным. Я не уверен, что это для веб-приложения, но если есть плагин jQuery с очень кликом, который предлагает некоторые варианты для этого.

http://digitalbush.com/projects/masked-input-plugin/

Они даже переходят к тому, как маскировать номера телефонов в их учебнике .

3
ответ дан Abe Miessler 18 August 2018 в 20:26
поделиться

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

Вот что я недавно использовал для клиентского проекта, где нам нужно было преобразовать все телефонные номера в любом формате в tel: links.

До сих пор он работал со всем, что они бросили на это, но если возникнут ошибки, я обновлю этот ответ.

Regex:

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

PHP-функция для замены всех телефонных номеров на tel : ссылки (в случае, если кому-то интересно):

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}
8
ответ дан Drew Thomas 18 August 2018 в 20:26
поделиться
  • 1
    Это регулярное выражение соответствует +1 1234562222222222222222222222. – Varda Elentári 13 October 2015 в 18:39
  • 2
    почему бы просто не вернуться? – thexande 8 March 2017 в 22:21

Я нашел, что это работает довольно хорошо:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Он работает для этих форматов:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050

Обязательно используйте глобальные и многострочные флаги, чтобы убедиться.

Ссылка: http://www.regexr.com/3bp4b

12
ответ дан Herobrine2Nether 18 August 2018 в 20:26
поделиться
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

Должен заканчиваться цифрой, может начинаться с (или + или цифры, и может содержать + - (или)

2
ответ дан Ian 18 August 2018 в 20:26
поделиться

Я работаю в компании, проводящей исследования рынка, и мы должны фильтровать эти типы ввода в любое время. Вы слишком усложняете это. Просто разделите не-буквенно-цифровые символы и посмотрите, есть ли расширение.

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

4
ответ дан Joe Phillips 18 August 2018 в 20:26
поделиться
  • 1
    Проверка? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908 соответствует вашему предлагаемому решению). – PlexQ 30 March 2012 в 18:17
  • 2
    @PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - пользователи изобретательны в мусоропроводе с помощью валидации. Лучше не отключать тех, кто действительно имеет некоторые нечетные данные, используя чрезмерно ограничительную проверку и сообщая им, что они ошибаются. – ReactiveRaven 29 April 2012 в 04:19

Я считаю, что Number :: Phone :: US и Regexp :: Common (особенно источник Regexp :: Common :: URI :: RFC2806 ) Могут помочь модули Perl.

Возможно, вопрос должен быть задан более подробно, чтобы объяснить цель проверки чисел. Например, 911 является допустимым числом в США, но 911x не имеет значения x. Это значит, что телефонная компания может рассчитать, когда вы закончите набор. Существует несколько вариантов этой проблемы. Но ваше регулярное выражение не проверяет часть кода области, поэтому это не вызывает беспокойства.

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

Если вы пытаетесь проверить ввод пользователя, почему бы не нормализовать результат и не сделать с ним? Если пользователь вводит номер, который вы не можете распознать как действительный номер, сохраните его как введенный или вычеркнутый недопустимый символ. Модуль Number :: Phone :: Normalize Perl может быть источником вдохновения.

6
ответ дан Jon Ericson 18 August 2018 в 20:26
поделиться
  • 1
    Я собираюсь выйти на конечность здесь и сказать, что разрешение 911 в качестве номера телефона, вероятно, является плохой идеей почти во всех приложениях этого регулярного выражения. Хороший улов. – Nicholas Flynt 10 July 2012 в 21:29

Чувство моей кишки подкрепляется количеством ответов на эту тему - что существует практически бесконечное количество решений этой проблемы, ни одна из которых не будет элегантной.

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

По моему мнению, самым элегантным решением является проверка минимальной длины, не более того.

9
ответ дан mindplay.dk 18 August 2018 в 20:26
поделиться
  • 1
    Попробовав несколько из них и пройдя через существующие данные и отзывы от пользователей, я бы склонен согласиться ... – Christopher King 17 January 2014 в 17:12

Вот моя лучшая попытка. Он обрабатывает форматы выше, но я уверен, что мне не хватает других возможных форматов.

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
7
ответ дан Nicholas Trandem 18 August 2018 в 20:26
поделиться

Моя склонность заключается в том, чтобы согласиться с тем, что зачистка цифр и просто принятие того, что там лучше. Возможно, чтобы обеспечить хотя бы пару цифр, хотя это и запрещает что-то вроде алфавитного номера телефона «ASK-JAKE», например.

Несколько простых выражений perl могут быть:

@f = /(\d+)/g;
tr/0-9//dc;

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

Опасно ли, что может потребоваться пауза, а затем ввести еще несколько клавиш? Или что-то вроде 555-1212 (дождитесь звукового сигнала) 123?

2
ответ дан piCookie 18 August 2018 в 20:26
поделиться

Вот что хорошо работает в JavaScript. Он находится в строке, потому что это то, что ожидал виджет Dojo.

Он соответствует десятизначному номеру NANP Северной Америки с дополнительным расширением. Пробелы, тире и периоды являются принятыми разделителями.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
3
ответ дан Richard Ayotte 18 August 2018 в 20:26
поделиться

Вы посмотрели на RegExLib ?

Ввод номера телефона в США привел к появлению списка возможностей.

14
ответ дан Rob Wells 18 August 2018 в 20:26
поделиться
  • 1
    ... многие из них, конечно, ошибочны. – tripleee 5 September 2012 в 18:36
  • 2
    Это похоже на отличный способ интегрировать непонятные ошибки в ваш код. – Tom Lord 26 October 2016 в 09:25

Сделайте замену на символы форматирования, затем проверьте оставшееся время действия телефона. В PHP,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

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

4
ответ дан rooskie 18 August 2018 в 20:26
поделиться

Рабочий пример для Турции, просто измените

d{9}

в соответствии с вашими потребностями и начните использовать его.

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}
2
ответ дан Sinan Eldem 18 August 2018 в 20:26
поделиться

У вас будет трудное время иметь дело с международными номерами с одним / простым регулярным выражением, см. этот пост о трудностях международных (и даже северных) телефонных номеров.

Вы хотите проанализировать первые несколько цифр, чтобы определить, что такое код страны, а затем действовать по-разному в зависимости от страны.

Кроме того - в списке, который вы указали, не содержится другой общий формат США - оставляя начальный 1. Большинство сотовых телефонов в США не требуют этого, и он начнет дезориентировать молодое поколение, если только они не набрали на международном уровне.

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

-адам

280
ответ дан 2 revs 18 August 2018 в 20:26
поделиться
  • 1
    здесь он не имеет расширения (я делаю, чтобы мои пользователи вводили ext в отдельном поле): ^ (?: (?: \ +? 1 \ s * (?: [.-] \ s *)?)? (? (\ S * ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9]) \ с *) | ([2-9] 1 [02-9] | [2-9] [02-8] 1 | [2-9] [02-8] [02-9])) \ S * (: [? .-] \ s *)) ([2-9] 1 [02-9] |? [2-9] [02-9] 1 | [2-9] [02-9] {2}) \ s * (?: [.-] \ S *)? ([0-9] {4}) $ – DJTripleThreat 4 May 2010 в 05:37
  • 2
    Не работал для меня. – Brian Armstrong 11 August 2010 в 20:53
  • 3
    Вот версия, которая соответствует только 10-значным номерам телефонов (не 7 цифр, например 843-1212): /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/ – Brian Armstrong 7 September 2010 в 20:32
  • 4
    10 цифр принимают () код зоны и не допускают предшествующий 1 как код страны (?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4}) – BandonRandon 9 January 2011 в 06:09
  • 5
    FYI регулярное выражение также соответствует: (4570457-6789, которое было бы довольно распространенной опечаткой. Группы матчей также перекошены: rubular.com/r/TaTP0mHL5c – SooDesuNe 20 February 2013 в 21:16
  • 6
    это подтверждает тонны чисел, которые технически недействительны. например, «- + () () ()) ())))». Научитесь читать регулярные выражения, чтобы вы могли понять, что делаете. – Steven Soroka 28 March 2013 в 16:47
  • 7
    @StevenSoroka У меня была книга Джеффри Фридла рядом со мной на моем столе в течение последних двух лет, так как регулярные выражения - большая часть моей работы. Для правильного понимания регулярных выражений требуется хорошее время. Иногда читатели этого сайта просто ищут существующий soltuion, вместо того, чтобы писать свои собственные, особенно в доменах с большим количеством угловых случаев, таких как номера телефонов. – Justin R. 28 March 2013 в 23:06
  • 8
    @ fatcat1111 Я это понимаю, но большинство ответов здесь «я тоже». тип одноразовых регулярных выражений, которые, вероятно, не подходят ни одному из ваших угловых случаев. Затем они попадают на все веб-сайты, которые я пытаюсь использовать, и я не могу ввести свой почтовый индекс, номер телефона или адрес электронной почты, потому что кто-то использовал полупеченое регулярное выражение (например: + является допустимым символом в адресах электронной почты ). Лучшие ответы на этой странице указывают пользователям на библиотеки, а не на регулярные выражения с пропиской. – Steven Soroka 5 April 2013 в 22:49
  • 9
    @StevenSoroka технически это может позволить много недействительных случаев, но когда мы думаем только о том, чтобы помочь пользователю избежать распространенных ошибок с помощью самого простого решения, это путь: – happyhardik 23 August 2013 в 19:44
  • 10
    это также соответствует пробелу, пустой строке – Wasim A. 16 September 2013 в 09:13
  • 11
    Это так неправильно. – Derek 朕會功夫 1 August 2014 в 17:47
  • 12
    @SooDesuNe Prepending (^|[^\d\n]) (с включенным многострочным флагом) позволяет избежать общей проблемы, гарантируя, что ей не сразу предшествует нечто числовое. – btown 23 March 2017 в 20:32
  • 13
    Не предлагаемое решение. ВОЗМОЖНО. Просто потому, что это сложно или сложно, это не значит, что вы должны просто поднять руки. – Relic 29 March 2017 в 16:14

Обратите внимание, что дескрипторы () не работают для стиля записи номеров Великобритании, которые являются общими: +44 (0) 1234 567890, что означает набирать международный номер: +441234567890 или на британском циферблате 01234567890

22
ответ дан 2 revs, 2 users 67% 18 August 2018 в 20:26
поделиться
281
ответ дан 2 revs 7 September 2018 в 04:29
поделиться
2
ответ дан 3 revs, 3 users 87% 7 September 2018 в 04:29
поделиться
281
ответ дан 2 revs 7 September 2018 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: