Комплексное регулярное выражение для проверки номера телефона

У меня была такая же проблема, прочитав это сообщение, но закончил создание этого решения, которое динамически выбирает divs, выбирая идентификатор из пользовательского класса в href с помощью функции attr() JQuery.

Вот JQuery:

$('a.custom_class').click(function(e) {
  var div = $(this).attr('href');
  $(div).toggle('fast');
  e.preventDefault();
}

И вам просто нужно создать ссылку, подобную этой, а затем в HTML:

<a href="#" class="#1">Link Text</a>
<div id="1">Div Content</div>
878
задан 5 revs, 5 users 65% 22 March 2017 в 16:18
поделиться

17 ответов

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

Затем Вы заканчиваете со значениями как:

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

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

  1 (234) 567-8901
  1 (234) 567-8901 x1234
506
ответ дан 3 revs, 3 users 87% 22 March 2017 в 16:18
поделиться

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

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

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

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

действительно ли это - беспокойство, что, возможно, должны быть пауза и затем больше вводимых ключей? Или что-то как 555-1212 (ожидают звукового сигнала), 123?

2
ответ дан piCookie 22 March 2017 в 16:18
поделиться

Действительно ли возможно иметь для дисплея 4 отдельных поля (Код зоны, 3-разрядный префикс, 4 части цифры, расширение) так, чтобы они могли ввести каждую часть адреса отдельно, и можно ли проверить каждую часть индивидуально? Тем путем можно не только сделать проверку намного легче, можно сохранить номера телефона в более последовательном формате в базе данных.

1
ответ дан Kibbee 22 March 2017 в 16:18
поделиться

Я верю Число:: Телефон:: США и Regexp:: Распространенный (особенно источник Regexp:: Распространенный:: URI:: RFC2806), модули Perl могли помочь.

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

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

, При попытке проверить ввод данных пользователем, почему бы не нормализовать результат и быть сделанными с ним? Если пользователь вставляет число, Вы не можете распознать как верный номер, или сохранить его, как введено или полоса undailable символы. Число:: Телефон:: Нормализуйте , модуль Perl мог быть источником вдохновения.

6
ответ дан Jon Ericson 22 March 2017 в 16:18
поделиться

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

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

4
ответ дан Joe Phillips 22 March 2017 в 16:18
поделиться

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

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

Вот сценарий жемчуга для тестирования его. Когда Вы соответствуете, 1$ содержит код зоны, 2$ и 3$ содержат номер телефона, и 5$ содержат расширение. Мой сценарий тестирования загружает файл с Интернета и печатает все номера телефона в нем.

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"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",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

Редактирование:

можно ли изменить \W* на \s*\W? \s* в regex для закручивания его немного. Я не думал о regex с точки зрения, скажем, проверки ввода данных пользователем на форме, когда я записал его, но это изменение позволяет использовать regex с этой целью.

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';
63
ответ дан 2 revs 22 March 2017 в 16:18
поделиться

Вы взглянули на RegExLib?

Вводящий американский номер телефона, возвращенный настоящий список возможностей.

15
ответ дан Rob Wells 22 March 2017 в 16:18
поделиться

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

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

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

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

-Adam

9
ответ дан 2 revs 22 March 2017 в 16:18
поделиться

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

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

Оказывается, что существует что-то вроде спецификации для этого, по крайней мере, для Северной Америки, названной NANP.

необходимо определить точно, что Вы хотите. Что такое легальные разделители? Пробелы, тире, и периоды? Никакой разделитель не позволяется? Можно смешать разделители (например, +0.111-222.3333)? Как расширения (например, 111-222-3333 x 44444) собирающийся обрабатываться? Что относительно специальных чисел, как 911? Код зоны собирается быть дополнительным или необходимым?

Вот regex для 7 или 10 чисел цифры с позволенными расширениями, разделители являются пробелами, тире, или периоды:

^(?:(?:\+?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})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
291
ответ дан 2 revs 22 March 2017 в 16:18
поделиться

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

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

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

^((((\(\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
ответ дан 22 November 2019 в 21:03
поделиться

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

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

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890
3
ответ дан 22 November 2019 в 21:03
поделиться

Замените символы форматирования, затем проверьте оставшиеся на соответствие телефону. В 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
ответ дан 22 November 2019 в 21:03
поделиться
.*

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

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

"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"
297
ответ дан 22 November 2019 в 21:03
поделиться

Я написал простейший (хотя мне не нужны были в нем точки).

^([0-9\(\)\/\+ \-]*)$

Как упоминалось ниже, он проверяет только символы, а не свою структуру/порядок

.
28
ответ дан 22 November 2019 в 21:03
поделиться

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

22
ответ дан 22 November 2019 в 21:03
поделиться

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

^([+])?([^\\d]?\\d){5,18}$

, Это позволит 5 - 18 цифр максимум с 1 символом между цифрами (как пространство или тире).

В конце я вышел из использования regex и начал использовать Veriphone.

0
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

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