Модификаторы регулярок в PHP

Как вы уже знаете, модификаторы представляют собой команды, которые пишутся после правого ограничителя регулярки. Давайте посмотрим, что полезного можно сделать с их помощью.

Игнорирование регистра

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

<?php preg_replace('#[a-z]+#', '!', 'aaa bbb AAA'); // вернет '! ! AAA' ?>

Мы можем изменить такое поведение регулярки, использовав модификатор i. Исправим нашу регулярку в соответствии с этим:

<?php preg_replace('#[a-z]+#i', '!', 'aaa bbb AAA'); // вернет '! ! !' ?>

Комментарии в регулярке

Модификатор x разрешает расставлять в регулярке произвольные пробелы и переводы строк. Кроме того, символ решетки становится символом однострочного комментария (соотвественно, ограничители придется заменить на другие).

Давайте посмотрим на примере. Пусть у нас есть вот такая регулярка:

<?php preg_replace('#[a-z]+@[0-9]+#', '!', 'aaa@333'); ?>

Давайте используем модификатор x и расставим в для каждой части нашей регулярки поясняющие комментарии:

<?php preg_replace('~ [a-z]+ # буквы @ # символ собаки [0-9]+ # цифры ~x', '!', 'aaa@333'); ?>

Работа с юникодом

Модификатор u, с которым вы уже сталкивались ранее, заставляет регулярку корректно работать с юникодом. В частности, корректно обрабатывать кириллические строки:

<?php preg_replace('#[а-яё]#u', '!', 'яяя ййй ёёё'); ?>

Изменение жадности

Модификатор U делает так, что все операторы повторений станут по умолчанию нежадными, а добавление ?, наоборот, будет добавлять им жадности:

<?php preg_replace('#x.+x#U', '!', 'xax xaax xaaax'); // вернет '! ! !' ?>

Экранировка обычных символов

Модификатор X делает так, что экранировка обычного символа приведет к ошибке. Без этого оператора обычные символы можно экранировать, они все равно будут обозначать сами себя (исключение: цифры, они станут карманами). Посмотрим на примере:

<?php preg_replace('#x\@x#X', '!', 'x@x'); // ошибка, @ не спецсимвол ?>

Несколько модификаторов

После ограничителя можно писать несколько модификаторов. Пример:

<?php preg_replace('#[a-z]+#iU', '!', 'aaa bbb'); ?>

Практические задачи

Упростите следующий код, использовав соответствующий модификатор:

<?php preg_replace('#[a-zA-Z]+#', '!', 'aaa BBB'); ?>

Расскажите, как меняют поведение регулярки модификаторы в следующем коде:

<?php preg_replace('#[a-z]+#Uu', '!', 'aaa bbb'); ?>

Расскажите, как меняют поведение регулярки модификаторы в следующем коде:

<?php preg_replace('#[a-z]+#Xx', '!', 'aaa bbb'); ?>

Расскажите, как меняют поведение регулярки модификаторы в следующем коде:

<?php preg_replace('#[а-яё]+#ui', '!', 'яяя ЙЙЙ ёёё'); ?>