PHP « Регулярное выражение для проверки номера телефона
Зарание спасибо.
upd: По поводу "прочие клёвые вариации": нужно так, как бы вы у СЕБЯ на сайте сделали ;)
1 ответов
Давай-ка разберемся.
Зачем пытаться сделать из рельсы вязальные крючки?
Тебе нужно определить является ли написанная последовательность цифр - телефоном? Так?
Те, кто сталкивался с написание систем обработчиков больших объемов данных согласятся со мной - что бы решить проблемы надо их пресекать в корне. То есть: одно из решений будет не давать пользователям вводить иои предоставлять неполные или данные в неверном формате. Как именно это сделать - ваш выбор.
Вариант второй - мы уже имеем много телефонов вот именно в таком виде... в полном беспорядке.
Проблема
Телефон написан не в том формате. Или это не телефон.Надо
Получить из любого представления телефон.Решение
Убираем все ненужные символы. Все кроме символа + в самом начале, если таковой присутствует.Берем стандартную форму представления телефонных номеров для разных стран или регионов (что определяет первые 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.
И так далее. В результате, у каждый страны примерно одинаковые шаблоны написания, достаточно их собрать или составить заново.
И выводить, выводить!
Первое что изобразилось на скорую руку:
preg_match('/^(\+?\d+)?\s*(\(\d+\))?[\s-]*([\d-]*)$/', $sub, $res);
PS "прочие клёвые вариации" было бы неплохо привести, а то получается разрешим числа и символы + ( ) - в любой последовательности вот вам и проверка .
Можно вот сюда заглянуть: 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 желательно проверить - не проверял
У меня была задача из полученного от пользователя номера телефона сделать во-первых цифровой вариант, типа 0931234567, во вторых для вывода (093)123-45-67, делал все просто, регуляркой вынимал из номера все цифры в строку, и брал последних 10 цифр, что давало мне из любого как угодно, но правильно введенного номера телефона номер вида 0931234567, далее из этого можно сделать все что угодно, в моем случае я обрезал первые три цифры - это однозначно код, остальные номер, проставил тире в виде XXX-XX-XX, и записал в базу как текстовое представление.
Код и описание по ссылке -> http://ar4ibal.pp.ua/?target=view&event=view_post&post_id=22
Опредилитесь в чем меньше зла - в промахах (не найдено то что надо найти) или ложных срабатываниях (найдено то что искать не надо). Потому что хороший регексп можно написать только если есть чёткая формулировка требований. А телефонный номер можно написать тысячей способов.
Вот простенький регексп на случай если возможность ложных срабатываний минимальная (например, если в тексте кроме телефонных номеров цифры встречатся редко):
/\b[+]?[-0-9\(\) ]{11,20}\b/
с учетом того как в украине меняют формат записи номер\ов я даже боюсь писать...
теперь иногда нужно ведущий ноль убирать и т.п. (сам с Донецка)
Только недавно писал, чтобы номера телефонов в записной книжке нормально отформатировать :))
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")));
$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 для россии
пользователя можно привязать к вводу именно этого формата
для правильной валидности можно еще проверить на количество цифр не больше 10 для городских номеров.