Уроки PHP – регулярные выражения с примерами
В сегодняшней статье мы рассмотрим регулярные выражения в PHP, а также увидим практические примеры использования регулярных выражений в PHP скриптах.
Основы регулярных выражений в PHP
В самом начале появления регулярных выражений на них была возложена задача помощи при работе со строками в Unix системах. Позже они стали активно использоваться не только в других системах, но и в разных языках программирования.
В PHP регулярные выражения используются для синтаксического анализа текста в соответствии с определенным шаблоном. Используя регулярные выражения, вы можете легко найти по шаблону нужный текст в строке, и заменить его, если нужно, или просто сделать проверку на наличие такого текста.
Типы регулярных выражений
Существует 2 типа регулярных выражений:
- Perl совместимый
- POSIX расширенный
Perl совместимые функции – это такие как preg_match
, preg_replace
, а версии POSIX – такие как ereg
, eregi
. Учтите, что последние функции считаются устаревшими в PHP 5.3.0 и были удалены в PHP 7. Поэтому мы будем использовать только Perl совместимые функции. Важно знать, что при использовании Perl-совместимых регулярных выражений, такое выражение должно быть заключено в разделители, например, косую черту (/
).
Основной синтаксис регулярных выражений в PHP
Чтобы использовать регулярные выражения, сначала вам нужно изучить синтаксис шаблонов. Мы можем сгруппировать символы внутри шаблона следующим образом:
- Обычные символы, которые следуют один за другим, например,
hello
- Индикаторы начала и окончания строки в виде
^
и$
- Индикаторы подсчета, такие как
+
,*
,?
- Логические операторы, такие как
|
- Группирующие операторы, такие как
{}
,()
,[]
Пример шаблона регулярного выражения для проверки правильности адреса электронного ящика выглядит следующим образом:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
Код PHP для проверки электронной почты с использованием Perl-совместимого регулярного выражения выглядит следующим образом:
<?php $pattern = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/"; $email = "some-email@test.com"; if (preg_match($pattern, $email)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
Теперь давайте посмотрим на подробный разбор синтаксиса шаблона при регулярном выражении:
Регулярное выражение (шаблон) | Проходит проверку (объект) | Не проходит проверку (объект) | Комментарий |
world |
Hello world | Hello Ivan | Проходит, если шаблон присутствует где-либо в объекте |
^world |
world class | Hello world | Проходит, если шаблон присутствует в начале объекта |
world$ |
Hello world | world class | Проходит, если шаблон присутствует в конце объекта |
world/i |
This WoRLd | Hello Ivan | Выполняет поиск в нечувствительном к регистру режиме |
^world$ |
world | Hello world | Строка содержит только «world» |
world* |
worl, world, worlddd | wor | Присутствует 0 или больше «d» после «worl» |
world+ |
world, worlddd | worl | Присутствует по крайней мере одна «d» после «worl» |
world? |
worl, world, worly | wor, wory | Присутствует 0 или 1 «d» после «worl» |
world{1} |
world | worly | Присутствует одна «d» после «worl» |
world{1,} |
world, worlddd | worly | Присутствует одна или больше «d» после «worl» |
world{2,3} |
worldd, worlddd | world | Присутствует 2 или 3 «d» после «worl» |
wo(rld)* |
wo, world, worldold | wa | Присутствует 0 или больше «rld» после «wo» |
earth|world |
earth, world | sun | Строка содержит «earth» или «world» |
w.rld |
world, wwrld | wrld | Содержит любой символ вместо точки |
^.{5}$ |
world, earth | sun | Строка содержит ровно 5 символов |
[abc] |
abc, bbaccc | sun | В строке есть «a», или «b» или «c» |
[a-z] |
world | WORLD | В строке есть любые строчные буквы |
[a-zA-Z] |
world, WORLD, Worl12 | 123 | В строке есть любые строчные или прописные буквы |
[^wW] |
earth | w, W | Фактический символ не может быть «w» или «W» |
Теперь перейдем к более сложному регулярному выражению с подробным объяснением.
Практические примеры сложных регулярных выражений
Теперь, когда вы знаете теорию и основной синтаксис регулярных выражений в PHP, пришло время создать и проанализировать некоторые более сложные примеры.
1) Проверка имени пользователя с помощью регулярного выражения
Начнем с проверки имени пользователя. Если у вас есть форма регистрации, вам понадобится проверять на правильность имена пользователей. Предположим, вы не хотите, чтобы в имени были какие-либо специальные символы, кроме «_.-
» и, конечно, имя должно содержать буквы и возможно цифры. Кроме того, вам может понадобиться контролировать длину имени пользователя, например от 4 до 20 символов.
Сначала нам нужно определить доступные символы. Это можно реализовать с помощью следующего кода:
[a-zA-Z0-9_.-]
После этого нам нужно ограничить количество символов следующим кодом:
{4,20}
Теперь собираем это регулярное выражение вместе:
^[a-zA-Z-0-9_.-]{4,20}$
В случае Perl-совместимого регулярного выражения заключите его символами ‘/
‘. Итоговый PHP-код выглядит так:
<?php $pattern = '/^[a-zA-Z0-9_.-]{4,20}$/'; $username = "demo_user-123"; if (preg_match($pattern, $username)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
2) Проверка шестнадцатеричного кода цвета регулярным выражением
Шестнадцатеричный код цвета выглядит так: #5A332C
, также допустимо использование краткой формы, например #C5F
. В обоих случаях код цвета начинается с #
и затем идут ровно 3 или 6 цифр или букв от a до f.
Итак, проверяем начало кода:
^#
Затем проверяем диапазон допустимых символов:
[a-fA-F0-9]
После этого проверяем допустимую длину кода (она может быть либо 3, либо 6). Полный код регулярного выражения выйдет следующим:
^#(([a-fA-F0-9]{3}$)|([a-fA-F0-9]{6}$))
Здесь мы используем логический оператор, чтобы сначала проверить код вида #123
, а затем код вида #123456
. Итоговый PHP-код проверки регулярным выражением выглядит так:
<?php $pattern = '/^#(([a-fA-F0-9]{3}$)|([a-fA-F0-9]{6}$))/'; $color = "#1AA"; if (preg_match($pattern, $color)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
3) Проверка электронной почты клиента с использованием регулярного выражения
Теперь давайте посмотрим, как мы можем проверить адрес электронной почты с помощью регулярных выражений. Сначала внимательно рассмотрите следующие примеры адресов почты:
john.doe@test.com john@demo.ua john_123.doe@test.info
Как мы можем видеть, символ @
является обязательным элементом в адресе электронной почты. Помимо этого должен быть какой-то набор символов до и после этого элемента. Точнее, после него должно идти допустимое доменное имя.
Таким образом, первая часть должна быть строкой с буквами, цифрами или некоторыми специальными символами, такими как _-.
. В шаблоне мы можем написать это следующим образом:
^[a-zA-Z0-9_.-]+
Доменное имя всегда имеет, скажем, имя и tld (top-level domain) – т.е, доменную зону. Доменная зона – это .com
, .ua
, .info
и тому подобное. Это означает, что шаблон регулярного выражения для домена будет выглядеть так:
[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
Теперь, если мы соберем все в кучу, то получим полный шаблон регулярного выражения для проверки адреса электронной почты:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
В коде PHP эта проверка будет выглядеть следующим образом:
<?php $pattern = '/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/'; $email = "john_123.doe@test.info"; if (preg_match($pattern, $email)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
Надеемся, что сегодняшняя статья помогла вам при знакомстве с регулярными выражениями в PHP, а практические примеры пригодятся вам при использовании регулярных выражений в собственных PHP скриптах.