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

Не силен в регулярках, поэтому спрашиваю у вас, дорогие читатели, регулярку для проверки номера телефона. Причем не абы какую, а всё по-честному: 8-123-456-7890, (123) 123-456-7, 81234567890, +380 1234567980 и прочие клёвые вариации.
Зарание спасибо.

upd: По поводу "прочие клёвые вариации": нужно так, как бы вы у СЕБЯ на сайте сделали ;)

1 ответов


Да как тута или тута например !


Опредилитесь в чем меньше зла - в промахах (не найдено то что надо найти) или ложных срабатываниях (найдено то что искать не надо). Потому что хороший регексп можно написать только если есть чёткая формулировка требований. А телефонный номер можно написать тысячей способов.

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

/\b[+]?[-0-9\(\) ]{11,20}\b/

для правильной валидности можно еще проверить на количество цифр не больше 10 для городских номеров.


$pattern = "#^([0-9\+]{0,3})\s?\(([0-9]{1,6})\)\s?([0-9\-]{1,9})$#";
if(!preg_match($pattern, $text))
print ('error');
C учетом и городских номеров стран
если просто мобильный
то
$pattern = "#^\+([0-9]{1,2})\s?\(([0-9]{1,3})\)\s?([0-9\-]{1,9})$#";
if(!preg_match($pattern, $text))
print ('error');
получаем логи баг
Поле заполнено не правильно - моб.+XX(XXX)XXX-XX-XX +X(XXX)XXX-XX-XX гор.(ХХХ)ХХХ-ХХ-ХХ (ХХХХХХ)ХХ-ХХ
в первом случае
Поле заполнено не правильно - моб.+XX(XXX)XXX-XX-XX +X(XXX)XXX-XX-XX
во втором случае
для правильной валидности можно еще проверить на количество цифр не больше 12 для моб украины
не больше 11 для россии
пользователя можно привязать к вводу именно этого формата


У меня была задача из полученного от пользователя номера телефона сделать во-первых цифровой вариант, типа 0931234567, во вторых для вывода (093)123-45-67, делал все просто, регуляркой вынимал из номера все цифры в строку, и брал последних 10 цифр, что давало мне из любого как угодно, но правильно введенного номера телефона номер вида 0931234567, далее из этого можно сделать все что угодно, в моем случае я обрезал первые три цифры - это однозначно код, остальные номер, проставил тире в виде XXX-XX-XX, и записал в базу как текстовое представление.

Код и описание по ссылке -> http://ar4ibal.pp.ua/?target=view&event=view_post&post_id=22


с учетом того как в украине меняют формат записи номер\ов я даже боюсь писать...
теперь иногда нужно ведущий ноль убирать и т.п. (сам с Донецка)


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

file_put_contents("Z:\google.csv", preg_replace("/(?:\\+)?[78](?:\\s|-)*[\\(]?(\\d{3})?[\\)]?(?:\\s|-)*(\\d{3})(?:\\s|-)*(\\d{2})(?:\\s|-)*(\\d{2})/", "+7 ($1) $2 $3$4", file_get_contents("Z:\google.csv")));

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

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

Проблема

Телефон написан не в том формате. Или это не телефон.

Надо

Получить из любого представления телефон.

Решение

Убираем все ненужные символы. Все кроме символа + в самом начале, если таковой присутствует.
Берем стандартную форму представления телефонных номеров для разных стран или регионов (что определяет первые 3-5 последовательностей цифр) И накладываем на нее получившуюся последовательность чисел.

Исходные данные
8-123-456-7890
(123) 123-456-7
81234567890
+380(44)345-67-80

Убираем лишнее
81234567890  <- (?*)Верно, Россия, внутренний номер по стране, стандартный шаблон
1231234567   <- Не верно не определен код страны (+) Номер слишком короткий.
81234567890  <- (?*)Верно, Россия, внутренний номер по стране, стандартный шаблон
+380443456780   <- Верно, Украина, мировой код страны, стандартный шаблон
* - Все телефоны должны начинатся с кода страны. Иначе никак. Иначе никак. +8 является кодом другой страны. 8 - внутренний телефон по стране. Как 02 - телефон милиции в каким нибудь городе или завсклад в селе Петрушкино. Если база русская, то можно считать, что 8 = +7.

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

Можно вот сюда заглянуть: http://regexlib.com/Default.aspx
На сайте большая коллекция RegEx выражений на все случаи жизни :)


Например, так

$phoneReg1 = '/^\d{1}-\d{3}-\d{3}-\d{4}$/';
$phoneReg2 = '/^\(\d{3}\) \d{3}-\d{3}-\d{1}$/';
$phoneReg3 = '/^\d{11}$/';

и прочие вариации :)

PS желательно проверить - не проверял

Первое что изобразилось на скорую руку:

preg_match('/^(\+?\d+)?\s*(\(\d+\))?[\s-]*([\d-]*)$/', $sub, $res);
PS "прочие клёвые вариации" было бы неплохо привести, а то получается разрешим числа и символы + ( ) - в любой последовательности вот вам и проверка .