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