Мне нужно проверить форму, и в ней у меня есть поле для ввода номеров телефонов.
Согласно википедии аргентинские телефонные номера, цитирую:
Коды городов могут состоять из 2, 3 или 4 цифр, а оставшиеся 6, 7 или 8 цифр — это местный номер телефона.
Например, номер
+54 11 1234-5678
Буэнос-Айреса состоит из 2-значного кода города, за которым следует 8-значный номер телефона; в то время как это+54 341 123-4567
будет пример номера Росарио.
Короче говоря, вам понадобится регулярное выражение, которое охватывает все эти случаи. И мне нужно было бы добавить к нему правило, которое было бы +54
необязательным.
На данный момент я использую это выражение как последний вариант:
/^\(?\d{2}\)?[\s\.-]?\d{4}[\s\.-]?\d{4}$/
но это не то, что я ищу, так как это позволяет (11) 1234 3434
или 1123243434
и т. д. Например, мне нужно добавить правила, описанные выше, (353) 123 4345
и сделать +54
их необязательными .
Мы можем выбрать валидацию двумя способами:
1. Простой способ: удалить все, что не является числом.
Прямой способ проверить, действителен ли аргентинский номер телефона, — удалить из строки все, что не является числом, и проверить, что он состоит из 10 цифр (плюс префиксы по желанию).
(местный номер без кода города не считается действительным
4444-0000
)Код:
2. Проанализируйте каждую часть числа
Если вместо этого мы заинтересованы в более исчерпывающей проверке, но в то же время извлекая каждую из частей, составляющих число, тогда мы используем гораздо более длинное и строгое регулярное выражение:
Не обманывайтесь длиной регулярного выражения: это в основном повторение необязательных разделителей (круглые скобки, пробелы, дефисы или точки), подтверждающих, что они находятся в одном из форматов, которые мы обычно используем. Тот факт, что это длинное регулярное выражение, не делает его менее эффективным.
Объясняется диаграммой Debuggex (откройте изображение на другой вкладке, чтобы увидеть 100%):
Характеристика:
+54
,0054
или54
.11
(+ 8 цифр)2xx
и3xx
(+ 7 цифр), или2xxx
и3xxx
(+ 6 цифр)06xx
и08xx
(+ 7 цифр, только если использовалось0
или54
)15
сотовый телефон после кода города (если не используется9
после международного кода).-
,.
и (необязательно,-
но.
только в допустимых местах).11-4-333-0000
Преимущество этого выражения в том, что оно позволяет использовать группы для возврата каждой части по отдельности. То есть мы можем принять результат функции как true/false или присвоить его переменной и получить каждую часть числа отдельно.
Код
Пример:
*Примечание: если в номере не использовались разделители, он мог быть ошибочно разделен на
area
3-значный код города, например343
(Парана), вместо 4-значного3436
(Виктория). Но этот код6
не теряется, он отображается как первая цифраlocal_1
, и в немnumero
вы получаете3436xxyyyy
... Новые коды городов создаются с течением времени, и единственный способ правильно разделить их — сравнить с постоянно обновляемым списком . Однако в большинстве случаев обычно не имеет смысла хорошо отделять эту цифру, различая, является ли она 4-значным кодом города или частью местного номера.Тесты
>>> Демо в Идеоне и в regex101
Объяснение регулярного выражения (только для фанатов)
Альтернативы:
Я предпочитаю этот тип проверки вручную для этого случая, но вам может быть проще использовать одно из следующих решений:
libphonenumber от Google (Порт на PHP: libphonenumber для PHP — демо ).
Twilio Lookup (REST API, требующий регистрации — запросы на проверку и форматирование бесплатны) — пример кода .
intl-tel-input для JavaScript (плагин jQuery с проверкой формы с использованием libphonenumber) — cdnjs — учебник
Или вы можете загрузить полный список присвоенных номеров с веб-сайта ENACOM и проверить наличие позывного и его блока.