Установка внутренних опций
Установки PCRE_CASELESS,
PCRE_MULTILINE,
PCRE_DOTALL,
PCRE_UNGREEDY,
PCRE_EXTRA,
PCRE_EXTENDED и
PCRE_DUPNAMES могут быть локально предопределены в шаблоне
с использованием специальных Perl-последовательностей,
заключённых между символами "(?" и ")". Ниже представлен список этих опций:
Например, (?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) в самом начале шаблона.