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

StackOverflow https://stackoverflow.com/questions/123559

  •  02-07-2019
  •  | 
  •  

Вопрос

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

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 доб.1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

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

Это было полезно?

Решение

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

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

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

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

  1 (234) 567-8901
  1 (234) 567-8901 x1234

Другие советы

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

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

Вот регулярное выражение для 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+))?$
.*

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

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

"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"

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

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

15555555555

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

Основные функциональные возможности:

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

Примеры

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

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

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

Я бы предложил пропустить простое регулярное выражение для проверки вашего номера телефона и использовать такую ​​библиотеку, как Google. libphonenumber (ссылка на проект 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, но люди также реализовали библиотеки для других языков, которые используют набор данных телефонных номеров Google i18n:

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

/^(?:(?:\(?(?: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

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

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

Вот Perl-скрипт для проверки.При совпадении $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* в регулярном выражении, чтобы немного его ужесточить.Когда я писал это регулярное выражение, я не думал о регулярном выражении с точки зрения, скажем, проверки ввода данных пользователем в форме, но это изменение позволяет использовать регулярное выражение для этой цели.

'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*))?';

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

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

Быстрая шпаргалка

  • Запустите выражение: /^
  • Если вам нужно пространство, используйте: [\s] или \s
  • Если вы хотите потребовать скобки, используйте: [(] и [)] .С использованием \( и \) уродливо и может запутать ситуацию.
  • Если вы хотите, чтобы что-то было необязательным, поместите ? после этого
  • Если вам нужен дефис, просто введите - или [-] .Однако, если вы не поместите его первым или последним в ряду других символов, вам, возможно, придется его экранировать: \-
  • Если вы хотите принять разные варианты выбора в слоте, заключите их в скобки: [-.\s] потребуется дефис, точка или пробел.Знак вопроса после последней скобки сделает все это необязательными для этого слота.
  • \d{3} :Требуется трехзначный номер:000-999.Сокращение от[0-9][0-9][0-9].
  • [2-9] :Для этого слота требуется цифра 2–9.
  • (\+|1\s)? :Примите «плюс» или 1 и пробел (символ вертикальной черты, |, — «или») и сделайте его необязательным.Знак «плюс» должен быть экранирован.
  • Если вы хотите, чтобы слоту соответствовали определенные числа, введите их: [246] потребуется 2, 4 или 6. [77|78] потребуется 77 или 78.
  • $/ :Завершить выражение

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

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

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

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

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

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

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

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

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

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

Вы осмотрели Регекслиб?

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

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

/^[+#*\(\)\[\]]*([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

Вы должны очистить его для демонстрации.После подтверждения мог хотя бы число.

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

^\(*\+*[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

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

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

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

^((((\(\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

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

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

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

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

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

((\+[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

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

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

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

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

-Адам

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

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

/^\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-ЯБЛОКО

Первоисточник: http://www.regexr.com/38pvb

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

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я нашел это чем-то интересным.Я не проверял, но похоже, что это сработает

<?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.';
}
?>

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

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

В своем руководстве они даже рассказывают, как замаскировать ввод номера телефона.

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

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

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

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

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

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

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

Пара простых выражений Perl может быть такой:

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

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

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

    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

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

Для тех, кто хочет сделать что-то подобное с ирландскими номерами мобильных телефонов, вот простой способ сделать это:

http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

По этой ссылке также есть решение JQuery.

РЕДАКТИРОВАТЬ:

решение jQuery:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Источник.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top