Установка внутренних опций

Установки модификаторов PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED и PCRE_DUPNAMES, которые влияют на шаблон глобально, переопределяют внутри шаблона буквами внутренних опций языка Perl, которые указывают между символами «(?» и «)». Буквы опций:

Буквы внутренних опций
iPCRE_CASELESS
mPCRE_MULTILINE
sPCRE_DOTALL
xPCRE_EXTENDED
UPCRE_UNGREEDY
XPCRE_EXTRA (не поддерживается с PHP 7.3)
JPCRE_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) в самом начале шаблона.

To Top