Установка внутренних опций
Установки 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) в самом начале шаблона.