При работе с текстами в любом современном языке программирования разработчики постоянно встречаются с задачами проверки введенных данных на соответствие нужному шаблону, поиска и замены тестовых фрагментов и прочими типовыми операциями по обработке символьной информации. Разработка собственных алгоритмов проверки приводит к потере времени, несовместимости программного кода и сложности в его развитии и модернизации.
Бурное развитие Интернета и языков WEB-разработки потребовало создания универсальных и компактных средств обработки текстовой информации при минимальном количестве требуемого для этого кода. Не является исключением и популярный среди начинающих и профессиональных разработчиков язык PHP. Регулярное выражение как язык текстовых шаблонов позволяет упростить задачи обработки текста и уменьшить программный код на десятки и сотни строк. Многие задачи вообще невозможно решить без него.
![php регулярное выражение](http://fb.ru/misc/i/gallery/19771/438106.jpg)
Регулярные выражения в PHP
Язык PHP содержит три механизма работы с регулярными выражениями - «ereg», «mb_ereg» и «preg». Наиболее распространенным является интерфейс «preg», функции которого обеспечивают доступ к библиотеке поддержки регулярных выражений PCRE, изначально разработанной для языка Perl, которая входит в комплект PHP. Preg-функции ищут в заданной текстовой строке совпадения, согласно определенному шаблону на языке регулярных выражений.
Основы синтаксиса
![регулярные выражения примеры](http://fb.ru/misc/i/gallery/19771/438107.jpg)
В рамках короткой статьи невозможно подробно описать весь синтаксис регулярных выражений, для этого существует специальная литература. Приведем только основные элементы для показа широких возможностей для разработчика и понимания примеров кода.
В PHP регулярное выражение формально определяется очень сложно, и поэтому упростим описание. Регулярное выражение представляет собой текстовую строку. Она состоит из выделенного разделителем шаблона и модификатора, указывающего на то, каким образом его обрабатывать. Возможно включение в шаблоны различных альтернатив и повторений.
Например, в выражении /\d{3}-\d{2}-\d{2}/m разделителем будет «/», далее идет шаблон, а символ «m» будет модификатором.
Вся мощь регулярных выражений кодируется с помощью метасимволов. Основным метасимволом языка является обратный слэш - «\». Он меняет тип следующего за ним символа на противоположный (т. е. обычный символ превращается в метасимвол и наоборот). Другим важным метасимволом является прямая черта «|», задающая альтернативные варианты шаблона. Еще примеры метасимволов:
^ | Начало объекта или строки |
( | Начало подшаблона |
) | Окончание подшаблона |
{ | Начало квантификатора |
} | Конец квантификатора |
\d | десятичная цифра от 0 до 9 |
\D | любой символ, не являющийся цифрой |
\s | пустой символ, пробел, табуляция |
\w | словарный символ |
PHP, обрабатывая регулярные выражения, пробел рассматривает как отдельный значимый символ, поэтому выражения АБВГДЕ и АБВ ГДЕ являются разными.
Подшаблоны
В PHP регулярные подшаблоны выделяются круглыми скобками и иногда называются «подвыражениями». Выполняют следующие функции:
Выделение альтернатив. Например, шаблон жар(кое|птица|) совпадет со словами «жар», «жар-птица» и «жаркое». А без скобок это будет только пустая строка, «птица» и «жаркое».
«Захватывающий» подшаблон. Это означает, что если в шаблоне совпала подстрока, то в качестве результата возвращаются все совпадения. Для наглядности приведем пример. Дано следующее регулярное выражение: победитель получает((золотую|позолоченный)(медаль|кубок)) - и строка для поиска совпадений: «победитель получает золотую медаль». Кроме исходной фразы, в результате поиска будут выданы: «золотую медаль», «медаль», «золотую».
Операторы повторений (квадрификаторы)
При составлении регулярных выражений очень часто необходимо анализировать повторения чисел и символов. Это не является проблемой, если повторений не очень много. Но что делать, когда мы не знаем их точного числа? В таком случае необходимо использовать специальные метасимволы.
Для описания повторений применяются квадрификаторы – метасимволы для задания количества. Квадрификаторы бывают двух типов:
- общие, заключенные в скобки;
- сокращенные.
Общий квантификатор задет минимальное и максимальное количество разрешенных повторений элемента в виде двух чисел в фигурных скобках, например так: х{2,5}. Если максимальное количество повторений неизвестно, второй аргумент не указывается: х{2,}.
Сокращенные квантификаторы представляют собой символы для наиболее распространенных повторений во избежание лишней перегрузки синтаксиса. Обычно используются три сокращения:
1. * - ноль и больше повторений, что эквивалентно {0,}.
2. + - одно и более повторений, т. е. {1,}.
3. ? – ноль или только одно повторение - {0,1}.
Примеры регулярных выражений
Для тех, кто изучает регулярные выражения, примеры - лучший учебник. Мы приведем несколько, которые показывают их широкие возможности при минимуме усилий. Все программные коды полностью совместимы с версиями PHP 4.x и выше. Для полного понимания синтаксиса и использования всех возможностей языка рекомендуем книгу Дж. Фридла «Регулярные выражения», где полностью рассматривается синтаксис и имеются примеры регулярных выражений не только на PHP, но и для языков Python, Perl, MySQL, Java, Ruby и C#.
Проверка корректности адреса E-mail
Задача. Существует Интернет-страница, на которой у посетителя запрашивается адрес email. Регулярное выражение должно проверять правильность полученного адреса перед отправкой сообщений. Проверка не дает гарантии, что указанный почтовый ящик реально существует и принимает письма. Но отсеять заведомо неправильные адреса она может.
Решение. Как и в любом языке программирования, на PHP регулярные выражения email-проверки адреса могут быть реализованы разными способами, и примеры в этой статье не являются окончательным и единственным вариантом. Поэтому в каждом случае мы будем приводить перечень требований, которые нужно учесть при программировании, а конкретная реализация полностью зависит от разработчика.
Итак, выражение, проверяющее правильность email, должно проверять следующие условия:
- Наличие в исходной строке символа @ и отсутствие пробелов.
- Доменная часть адреса, за символом @, содержит только допустимые символы для доменных имен. То же относится и к имени пользователя.
- При проверке имени пользователя необходимо определить наличие специальных символов, таких как апостроф или вертикальная черта. Такие символы относятся к потенциально опасным и могут содержаться в таких видах нападений, как SQL-инъекции. Избегайте таких адресов.
- Имена пользователя допускают наличие только одной точки, которая не может быть первым или последним символом в строке.
- Доменное имя должно содержать не меньше двух и не более шести символов.
Пример, учитывающий все указанные условия, можно увидеть далее на рисунке.
![php регулярные выражения email](http://fb.ru/misc/i/gallery/19771/438108.jpg)
Проверка правильности адресов URL
Задача. Проверить, является ли заданная текстовая строка допустимым адресом URL. Еще раз отметим, что регулярные выражения URL-проверки могут быть реализованы различными способами.
Решение. Наш итоговый вариант выглядит следующим образом:
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
Теперь разберем его составляющие более подробно, используя рисунок.
![регулярные выражения url](http://fb.ru/misc/i/gallery/19771/438109.jpg)
п.1 | Перед адресом URL не должно быть никаких символов |
п.2 | Проверяем наличие обязательного префикса «http» |
п.3 | Не должно быть символов |
п.4 | Если присутствует «s», то URL указывает на защищенное соединение «https» |
п.5 | Обязательный фрагмент «//» |
п.6 | Нет символов |
п. 7-9 | Проверка правильности домена первого уровня и наличия точки |
п.10-13 | Контроль правильности написания домена второго уровня и точки |
п.14-17 | Файловая структура URL — набор цифр, букв, подчёркиваний, дефисов, точек и слэш в конце |
Проверяем номера кредитных карт
Задача. Необходимо реализовать проверку правильности введенного номера пластиковой карты наиболее распространенных платежных систем. Рассмотрен вариант только для карт Visa и MasterCard.
Решение. При создании выражения необходимо учитывать возможное наличие во введенном номере пробелов. Цифры номера на карте разделены на группы для упрощения чтения и диктовки. Поэтому вполне естественно, что человек может попытаться ввести номер таким образом (т. е. используя пробелы).
Написать универсальное выражение, учитывающее возможные пробелы и дефисы, сложнее, чем просто отбросить все символы, кроме цифр. Поэтому в выражении рекомендуется использовать метасимвол /D, который удаляет все символы, кроме цифр.
Теперь можно переходить непосредственно к проверке номера. Все компании, выпускающие кредитные карты, используют уникальный формат номера. В примере это используется, и клиенту нет необходимости вводить наименование компании – она определяется по номеру. Карты Visa всегда начинаются с 4 и имеют длину номера в 13 или 16 цифр. MasterCard начинается в диапазоне 51-55 с длиной номера 16. В итоге получаем такое выражение:
![регулярные выражения примеры](http://fb.ru/misc/i/gallery/19771/438110.jpg)
Перед обработкой заказа можно провести дополнительную проверку последней цифры номера, которая вычисляется по алгоритму Луна.
Проверка телефонных номеров
Задача. Проверка корректности введенного телефонного номера.
Решение. Количество цифр в стационарных и мобильных телефонных номерах значительно различается в зависимости от страны, поэтому универсально проверить, используя регулярные выражения, номер телефона на правильность невозможно. Но международные номера имеют строгий формат и отлично подходят для проверки по шаблону. Тем более что все больше национальных телефонных операторов стараются соответствовать единому стандарту. Структура номера следующая:
+CCC.NNNNNNNNNNxEEEE, где:
- C – это код страны, состоящий из 1-3 цифр.
- N – номер длиной до 14 цифры.
- E – необязательное расширение.
Плюс является обязательным элементом, а знак х присутствует только при необходимости расширения.
В результате имеем следующее выражение:
^\+[0-9]{1,3}\.[0-9]{4,14}(?:x.+)?$
Числа в диапазоне
Задача. Необходимо обеспечить совпадение целого числа из определенного диапазона. Дополнительно необходимо, чтобы находили регулярные выражения только цифры из диапазона значений.
Решение. Приведем несколько выражений для нескольких наиболее распространенных случаев:
Определяем час от 1 до 24 | ^(1[0-2]|[1-9])$ |
День внутри месяца 1-31 | ^(3[01]|[12][0-9]|[1-9])$ |
Секунда или минута 0-59 | ^[1-5]?[0-9]$ |
Число от 1 до 100 | ^(100|[1-9]?[0-9])$ |
День года 1-366 | ^(36[0-6]|3[0-5][0-9]|[12][0-9]{2}|[1-9][0-9]?)$ |
Поиск IP-адреса
Задача. Необходимо определить, является ли заданная строка допустимым IP-адресом в формате IPv4 в диапазоне от 000.000.000.000-255.255.255.255.
Решение. Как и в любой задаче на языке PHP, регулярное выражение имеет множество варинтов. Например, такое:
![регулярные выражения пробел](http://fb.ru/misc/i/gallery/19771/438111.jpg)
Онлайн-проверка выражений
![email регулярное выражение](http://fb.ru/misc/i/gallery/19771/438112.jpg)
Проверка регулярных выражений на правильность для начинающих программистов может быть затруднительной из-за сложности синтаксиса, отличающегося от «обычных» языков программирования. Для решения данной проблемы существует множество онлайн-тестеров выражений, позволяющих легко проверить правильность созданного шаблона на реальном тексте. Программист вводит выражение и данные для проверки и мгновенно видит результат обработки. Обычно здесь же присутствует справочный раздел, где подробно описываются регулярные выражения, примеры и отличия реализации для наиболее распостраненных языков программирования.
Но полностью доверять результатам онлайн-сервисов не рекомендуется всем разработчикам, пользующимся PHP. Регулярное выражение, написанное и проверенное лично, повышает квалификацию и гарантирует отсутствие ошибок.