PHP → Регулярные выражения

Регулярные выражения — система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (англ. 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]*$/» способно завести в замешательство. Но зато функциональность и гибкость перекрывают с лихвой все недостатки.

  • Php junior

    дякую за роз’яснення про українські літери =)