Включите исполнение JavaScript в браузере, чтобы запустить приложение.

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

2 сен 2024
Регулярные выражения PHP, синтаксические элементы, функции, особенности регулярных выражений, примеры применения regexp

Введение в регулярные выражения и их важность в PHP

Регулярные выражения, они же PCRE (Perl Compatible Regular Expressions), RegEx PHP, regexp — инструмент для поиска и замены подстроки в соответствии с определенным шаблоном. В PHP они широко используются для обработки текстовых, реже числовых данных. Рассмотрим подробнее возможности этого инструмента для программистов.

Основы регулярных выражений

Основное применение регулярных выражений — обработка текста: поиск, проверка, замена определенных элементов, состоящих из букв, цифр, специальных символов, знаки пунктуации. 

Важно отметить, что любое выражение в коде может быть «регулярным», а значит, использоваться для проверки или поиска определенных символов. Даже имя «Вася» или адрес электронной почты. Однако применение таких выражений обычно ограничено узким контекстом, таким как составление частотных словарей или автозамена.

Синтаксические элементы и их функции 

Регулярное выражение — последовательность символов. Ее началом служит разделитель — обычно слэш ('/'). За ним уже следует само выражение. После еще одного разделителя идет список модификаторов. 

Приведем пример — /\d{3}-\d{2}/m:

  • символ '/' — разделитель, 
  • строчка '\d{3}-\d{2}' — само выражение, 
  • символ 'm' после второго слэша — модификатор.

В основе синтаксиса RegEx PHP лежит обработка некоторых символов как метасимволов. Каждый метасимвол выполняет определенную роль.

Один из наиболее важных и распространенных метасимволов — обратный слэш ('\'). Если он встречается в строке, следующий за ним символ рассматривается парсером двояко:

1. Следующий за слэшем символ теряет свое специальное значение. Например, символ '.', который обычно означает «любой одиночный символ», в таком случае просто интерпретируется как точка. Сам обратный слэш тоже можно лишить специального значения: '\\'.

2. Соединенный с обратным слэшем символ может получить специальное значение. Например, символ 'd' в большинстве случаев просто воспринимается как буква, но после обратного слэша ('\d') он начинает обозначать любую цифру.

Ряд символов становится метасимволами при соединении с разделителем. Обычно эти пары указывают на то, что в данной позиции строки должен быть некий символ с определенным кодом, отсутствующим в обычном наборе, либо символ, относящийся к определенной группе.

Есть некоторая особенность в работе метасимволов в регулярных выражениях, заключенных в квадратные скобки. Многие из них действуют только вне области определения подмножеств. Внутри этих подмножеств действуют лишь следующие:

1. Обратный слэш ('\'). Будут применяться все метасимволы из предыдущей таблицы.

2. Минус ('-'). Используется для указания диапазона символов (все цифры, например, задаются как '0-9').

3. Символ '^'. При нахождении в начале определения подмножества символов он означает отрицание. Так задаются все символы, не указанные в данном подмножестве.

Функции PHP для работы с регулярными выражениями

PCRE предлагает широкий спектр функций:

  • preg_grep(): фильтрует массив, оставляя элементы, соответствующие выражению.
  • preg_match(): ищет первое вхождение выражения в заданной строке.
  • preg_match_all(): возвращает в заданной строке все вхождения, соответствующие регулярному выражению.
  • preg_quote(): преобразует спецсимвол в шаблон выражения в экранированную форму.
  • preg_replace(): ищет и заменяет значения по шаблону выражения в строке.
  • preg_replace_callback(): аналогично preg_replace(), но вместо замены использует пользовательскую функцию обратного вызова, чтобы создать новую строку.
  • preg_split(): разделяет строку на массив подстрок, используя выражение как разделитель.

Особенности регулярных выражений в PHP

  1. Чтобы regex можно было без проблем использовать в PCR, шаблон нужно заключить в разделители.
  2. В отличие от POSIX в PCRE нет специальных функций для поиска совпадений без учета регистра. Вместо этого используется модификатор ```i``` (```PCRE_CASELESS```). PCRE также поддерживает другие модификаторы шаблонов, позволяющие изменять стратегию поиска совпадений.
  3. Функции POSIX находят самое длинное совпадение, ближайшее к левому краю, в то время как PCRE останавливается при первом найденном совпадении. Это различие может иметь существенное влияние на результаты поиска, особенно если строка содержит несколько вхождений шаблона.
  4. Определение «символьного класса» в POSIX отличается от PCRE. PCRE поддерживает простые выражения в квадратных скобках, чтобы искать конкретные символы, в то время как составные элементы, символьные классы и символьные эквиваленты POSIX не поддерживаются. Передача в PCRE выражения символьного класса, начинающегося и заканчивающегося на ```:```, ```.``` или ```=```, приведет к ошибке компиляции, поскольку PCRE рассматривает это как попытку использовать одну из этих неподдерживаемых функций.

Практические примеры и шаблоны

Приведем пример конкретной реализации regex PHP, используя упомянутые выше реализации. Также добавляем валидацию имени пользователя, так он не сможет вводить слишком короткие сочетания букв (предположим, это никнеймы, а не имена, имена бывают короче двух букв):

$pattern_name = '/\w{3,}/';

$pattern_mail = '/\w+@\w+\.\w+/';

$pattern_password = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/';

if (preg_match($pattern_name, $name) &&

preg_match($pattern_mail, $mail) &&

preg_match($pattern_password, $_POST['password'])) {

 # регистрация пользователя, отправка письма, создание карточки в базе данных }

Regexp — мощный инструмент для поиска, обработки, манипулирования текстовыми данными в PHP. Независимо от того, являетесь ли вы опытным разработчиком или только начинаете свой путь в мире программирования, это ценное дополнение к вашему набору инструментов, которое может повысить точность вашей работы, особенно с текстовыми данными.