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

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

  • 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

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

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

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

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

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

Ответ 2

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

Вам нужно точно указать, что вы хотите. Что такое правовые разделители? Пробелы, тире и периоды? Не допускается использование разделителя? Можно ли смешивать разделители (например, + 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+))?$

Ответ 3

.*

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

#!/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";
        }
}

Edit:

Вы можете изменить \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*))?';

Ответ 7

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

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

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

  • Запустите выражение: /^
  • Если требуется пространство, используйте: [\s] или \s
  • Если вы хотите потребовать скобки, используйте: [(] и [)]. Использование \( и \) является уродливым и может сбить с толку.
  • Если вы хотите, чтобы что-то было необязательным, поместите ? после него
  • Если вы хотите дефис, просто введите - или [-]. Если вы не ставите его первым или последним в ряд других символов, вам может потребоваться его избежать: \-
  • Если вы хотите принять разные варианты в слоте, поместите скобки вокруг параметров: [-.\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.
  • $/: Завершить выражение

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

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

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

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

Ответ 11

Просматривали ли вы RegExLib?

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

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

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

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

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

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

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

Ответ 15

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

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

Ответ 16

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

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

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

Ответ 17

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

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

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

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

-Adam

Ответ 18

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

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

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

Regex:

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

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

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

Ответ 19

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

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

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

Positive:
+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

Negative:
926 3 4
8 800 600-APPLE

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

Ответ 20

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

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

Ответ 21

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

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

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

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

Ответ 22

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

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

Ответ 23

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

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

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

Ответ 24

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

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

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

Ответ 25

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

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

Ответ 26

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

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

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

Ответ 27

Здесь хорошо работает JavaScript. Это в строке, потому что то, что ожидал виджет Dojo.

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

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

Ответ 28

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

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

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

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

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

Ответ 29

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

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

Ответ 30

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

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.

EDIT:

Решение 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._-][email protected][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();
});


});

Источник.