Установка внутренних опций |
Наверх Предыдущий Следующий |
Установки опций PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL и PCRE_EXTENDED могут быть изменены изнутри шаблона при помощи символов опций Perl. Эти управляющие символы должны быть заключены между "(?" и ")". Существуют следующие управляющие символы:
К примеру, (?im) устанавливает многострочный режим проверки без учета регистра. Можно также сбросить определенные опции, если предварить буквы символом минус "-". К примеру (?im-sx) устанавливает опции PCRE_CASELESS и PCRE_MULTILINE одновременно сбрасывая опции PCRE_DOTALL и PCRE_EXTENDED. Если буква присутствует как до так и после символа минус "-", то опция сбрасывается.
Область действия этих установок зависит от того, где они встречаются в шаблоне. Для установок находящихся за пределами подшаблонов (обсуждаемых далее), эффект тот же самый, как если бы они были установлены или сброшены в начале шаблона. Так, все ниже перечисленные шаблоны ведут себя одинаково: (?i)abc a(?i)bc ab(?i)c abc(?i) что в свою очередь эквивалентно компиляции шаблона abc с установленной опцией PCRE_CASELESS. Другими словами, такие установки "верхнего уровня" применяются ко всему шаблону (до тех пор, пока они не будут изменены внутри подшаблона). Если на "верхнем уровне" в шаблоне имеется несколько установок одной и той же опции, то используется самая правая.
Если изменение опции происходит внутри подшаблона, то эффект совершено другой. Такое измененное поведение является нововведением в 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) специфична в том, что она должна появиться в шаблоне до любых других, даже если она используется на "верхнем уровне". Лучше всего поместить ее в начало шаблона.
|