Установки модификаторов PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED и PCRE_DUPNAMES, которые влияют на шаблон глобально, переопределяют внутри шаблона буквами внутренних опций языка Perl, которые указывают между символами «(?» и «)». Буквы опций:
i | PCRE_CASELESS |
m | PCRE_MULTILINE |
s | PCRE_DOTALL |
x | PCRE_EXTENDED |
U | PCRE_UNGREEDY |
X | PCRE_EXTRA (не поддерживается с PHP 7.3) |
J | PCRE_INFO_JCHANGED |
Шаблон (?im), например, устанавливает регистронезависимое многострочное сопоставление. Перед опцией, которую нужно сбросить, ставят символ «-» или комбинируют установку и отмену режимов. Запись (?im-sx), например, устанавливает флаги PCRE_CASELESS, PCRE_MULTILINE и отменяет флаги PCRE_DOTALL и PCRE_EXTENDED. Модуль отменит опцию, если символ расположили одновременно до и после символа «-».
Парсер применит изменение к оставшейся части шаблона, если опцию изменяют на верхнем уровне (т. е. вне круглых скобок подшаблона). Поэтому шаблон /ab(?i)c/
совпадёт только со значениями «abc» и «abC».
Эффект будет другим, если опцию изменяют внутри подшаблона. Это изменение поведения в Perl 5.005. Изменение опции внутри подшаблона повлияет только на ту часть шаблона, которая следует за ним, то есть шаблон (a(?i)b)c
совпадёт с «abc» и «aBc» и больше ни с чем (разумеется, если не включили режим PCRE_CASELESS). Это означает, что опции умеют задавать разные настройки в разных частях шаблона. Изменения в одной альтернативе переносятся и в другие ветки в пределах того же подшаблона. Например, шаблон (a(?i)b|c)
совпадёт с «ab», «aB», «c», и «C», хотя и при совпадении с «C» первая ветка была отброшена до установки опции. Это происходит потому, что модуль устанавливает опции на этапе компиляции. В противном случае поведение было бы странным.
Специфичные для модуля PCRE опции, например PCRE_UNGREEDY и PCRE_EXTRA, разрешено устанавливать так же, как и Perl-совместимые опции, — через символы U и X. Установка флага (?X) отличается тем, что должен быть расположен в шаблоне прежде, чем будет установлена любая другая дополнительная возможность, даже если его расположили на верхнем уровне. Рекомендовано размещать флаг (?X) в самом начале шаблона.