Регулярные выражения — система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (англ. pattern), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской».
Общая задача механизма регулярных выражений — находить или не находить совпадения строки или ее части с шаблоном. В PHP существует несколько функций для работы с регулярными выражениями: ereg()
, ereg_replace()
, eregi()
, ereg_replacei()
и split()
.
Хочу кратко остановиться на реализации, с помощью регулярных выражений, тех задач с которыми мне пришлось столкнуться лично и на поиск которых мне пришлось потратить некоторое время.
В PHP, для выполнения проверки на соответствие регулярному выражению, зачастую используют функцию preg_match(), которая ищет в заданном тексте subject совпадения с шаблоном pattern:
int preg_match (string pattern, string subject [, array matches [, int flags [, int offset]]])
Приведу решение частых нетривиальных задач, решение которых другими средствами (без регулярных выражений) было бы если не невозможным, то покрасней мере значительно более сложным.
Проверка e-mail
Предположим в наш обработчик obrabotka.php поступает из некой формы переменная $mail. Подразумевается, что она должна содержать адрес электронной почты. Для проверки корректности ввода пользователем электронного адреса воспользуемся следующей проверкой:
if (!preg_match("|^([a-z0-9_.-]{1,20})@([a-z0-9.-]{1,20}).([a-z]{2,4})|is", strtolower($mail))) { echo "email адрес не верный"; }
До знака «@» допускается от 1 до 20 символов, включая латинские символы a-z..A-Z, цифры от 0 до 9, а также символы точка «.» и тире «-». После знака «@» допускается ввод всё тех же символов, разделённых точкой, плюс 2-4 символа на обозначение доменной зоны “com”, “ru” и т.д.
Проверка ФИО (Фамилии Имени Отчества)
В данном случае задача состоит в том, чтобы ограничить ввод только допустимыми символами и только в формате «Фамилия Имя Отчество», «Фамилия И О» или же «Фамилия И.О.». Предполагается что фамилия, имя и отчество могут состоять из любых символов; фамилия должна быть отделена от имени пробелом; имя и отчество могут быть полными, а могут состоять из одной буквы-сокращения или же могут быть разделены пробелом; либо же после каждой буквы имени и отчества может стоять точка.
Проверка будет иметь вид:
if (preg_match("/([^s]+)s+([^s.])[^s.]*(?:s|.)([^s.])[^s.]*/", strtolower($fio))) { echo "Ошибка ввода Ф.И.О."; }
Украинские буквы в регулярных выражениях
При задании проверки с помощью функции preg_match(), следует особо обращать внимание на символы І, і, Ї, ї, Є, є, Ґ, ґ и валидность проверки. Предположим необходимо проконтролировать корректность ввода имени пользователя, переменная $user_name, сохранив при этом возможность ввода украинских букв в именах (например «Іван», «Марія» и т.д.).
При реализации проверки с помощью, регулярных выражений, стандартным рекомендуемым методом:
if (preg_match("/[^a-z,A-Z,0-9,а-я,А-Я,-,_]/", $user_name)) { echo "Ошибка, недопустимые символы"; }
часто возникает ошибка, при появлении в именах украинских букв. Для решения проблемы достаточно немножко модифицировать выражение, указав дополнительно возможность ввода символов І, і, Ї, ї, Є, є, Ґ, ґ.
if (preg_match("/[^a-z,A-Z,0-9,а-яіїєґ,А-ЯІЇЄҐ,-,_]/", $user_name)) { echo "ошибка, недопустимые символы"; }
Проверка ввода чисел
Ну и на последок, для ограничения ввода только числовых значений (актуально например, для параметров id, page и т.д.) можно воспользоваться проверкой:
if (!preg_match("|^[d]+$|", $id)) { exit ("Неверный формат запроса, требуется число"); }
Как видим механизм регулярных выражений предоставляет нам широкие возможности, но при этом является достаточно трудным для восприятия.. выражение вроде «/^(?:http://)?[-0-9a-z._]*.w{2,4}[:0-9]*$/» способно завести в замешательство. Но зато функциональность и гибкость перекрывают с лихвой все недостатки.