Установка внутренних опций
Установки 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) в самом начале шаблона.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Обработка текста
- Функции для работы с регулярными выражениями (Perl-совместимые)
- Регулярные выражения PCRE
- Вступление
- Разделители
- Метасимволы
- Экранирующие последовательности
- Свойства Unicode-символов
- Якоря
- Метасимвол точка
- Символьные классы
- Альтернативный выбор
- Установка внутренних опций
- Подмаски
- Повторение
- Обратные ссылки
- Утверждения
- Однократные подмаски
- Условные подмаски
- Комментарии
- Рекурсивные шаблоны
- Производительность
Коментарии
There is also the possibility to enable Modifier only on a specific group, so that the Modifier doesn't stay valid until end or deactivation with "(?-<modifier>)".
The Syntax for that is "?<modifier>:" on the beginning of the group, i.e. (?i:foo) matches on FoO.
When using the (?i:foo) syntax, it appears that the group is not included in the 'matches' argument unless it is nested in an additional set of parenthesis, for example: ((?i:foo))