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.