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


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