CakeFest 2024: The Official CakePHP Conference

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

Установки модификаторов 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) в самом начале шаблона.

add a note

User Contributed Notes 2 notes

up
3
mike at clove dot com
14 years ago
When using the (?i:foo) syntax, it appears that the group is not included in the 'matches' argument unless it is nested in an additional set of parenthesis, for example: ((?i:foo))
up
2
mati_ at zenbe dot com
14 years ago
There is also the possibility to enable Modifier only on a specific group, so that the Modifier doesn't stay valid until end or deactivation with "(?-<modifier>)".

The Syntax for that is "?<modifier>:" on the beginning of the group, i.e. (?i:foo) matches on FoO.
To Top