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

Наверх  Предыдущий  Следующий

Установки опций PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL и PCRE_EXTENDED могут быть изменены изнутри шаблона при помощи символов опций Perl. Эти управляющие символы должны быть заключены между "(?" и ")". Существуют следующие управляющие символы:

 

i

PCRE_CASELESS

Символы в шаблоне будут совпадать с символами как в верхнем, так и в нижнем регистре. Это эквивалентно опции Perl - /i.

m

PCRE_MULTILINE

По умолчанию, PCRE рассматривает исходную строку как состоящую из единственной строчки символов (даже если в действительности в ней присутствуют символы перевода строки). Метасимвол "начало строки" ("^") дает совпадение только с началом строки, в то время как метасимвол "конец строки" ("$") дает совпадение только с концом строки или с символом перевода строки в конце строки (при условии, что не установлена опция PCRE_DOLLAR_ENDONLY). Когда установлена опция PCRE_MULTILINE "начало строки" и "конец строки" будут давать совпадения после и до символа перевода строки в исходной строке, соответственно, а также в самом начале и в самом конце. Это эквивалентно опции Perl -/m. Если исходной строке отсутствует символ "\n" или если символы "^" и "$" не используются в шаблоне, установка PCRE_MULTILINE не имеет никакого эффекта.

s

PCRE_DOTALL

Если эта опция установлена, то метасимвол точка "." в шаблоне будет совпадать с любыми символами, включая символ перевода строки. В противном случае, совпадения символом перевода строки не происходит. Это эквивалентно опции Perl - /s . Негативный класс символов, такой как [^a] всегда совпадает с символом перевода строки, вне зависимости от установки этой опции.

x

PCRE_EXTENDED

Если эта опция установлена, "пробельные" символы в шаблоне полностью игнорируются, за исключением случаев, когда они предварены символом "\" или используются в объявлении класса символов. Все что находится после символа "#" и до символа перевода строки включительно также игнорируется (вне класса символов). Это эквивалентно опции Perl - /x и позволяет включать комментарии внутри сложных шаблонов. Следует отметить, однако, что это применимо только к символам данных. "Пробельные" символы никогда не могут появляться внутри специальных последовательностей символов в шаблоне. К примеру, внутри последовательности "(?(", которая вводит условный подшаблон.

 

К примеру, (?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) специфична в том, что она должна появиться в шаблоне до любых других, даже если она используется на "верхнем уровне". Лучше всего поместить ее в начало шаблона.