Уроки 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 скриптах.