Как вы уже знаете, модификаторы представляют собой команды, которые пишутся после правого ограничителя регулярки. Давайте посмотрим, что полезного можно сделать с их помощью.
Игнорирование регистра
По умолчанию в регулярках регистр символов имеет значение. В следующем примере мы найдем только буквы в нижнем регистре:
<?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', '!', 'яяя ЙЙЙ ёёё');
?>