необходимо определить, оканчивается ли длинный
Допустим, необходимо определить, оканчивается ли длинный текст на символы «Хх». При обычном шаблоне /Хх$/ проверка будет проходить от начала текста (сначала будет искаться символ, а потом определяться, стоит ли он в конце). Если усложнить шаблон до Г(. .*)Хх$/, это не сильно ускорит обработку, так как большую часть времени будет перебираться повторение первого подшаблона, и только потом определяться окончание текста. Если же написать шаблон как: /А(?>.*)(?<=Хх}$/, то первый подшаблон сразу же захватит весь текст целиком, а затем будет проверено окончание.
Последней замечательной особенностью регулярных выражении являются условные структуры, позволяющие выбирать подходящий под-шаблон в зависимости от результатов поиска. Они записываются так:
(? (условие) подшаблон!) или (?(условие)подшаблон1|подшаблон2).
При выполнении условия используется первый подшаблон, в противном случае (если он указан) — второй. Условия бывают двух типов.
Если условием является числовая последовательность, то условие верно при нахождении подшаблона с указанным номером, то есть когда существует непустая ссылка с таким номером. Например, следующий шаблон разделяет текст со скобками (невложенными):
/ ( ( \( )? # необязательная открывающая скобка ( [*()]+ ) # все. кроме скобок С?(2) \) )# если была открывающая скобка, должна быть закрывающая )+ I повторим? /х
Если условие нечисловое, то это должна быть сложная претензия. Например, следующий шаблон ищет десятичное число либо шест-надцатеричное (с префиксом х):
/ (?(?=х) # если префикс х [\da-fA-F]+ # то шестнадцатеричное число Синтаксис регулярных выражений (PCRE) I \d+ # иначе - десятичное ) /x
Модификаторы
Функционирование регулярных выражений можно видоизменять модификаторами трех уровней: глобальными, внешними и внутренними.
Модификатор |
Внутреннее имя |
Воздействие |
i |
PCRE_CASELESS |
Игнорировать регистр |
S |
PCRE_DOTALL |
Точка = [\0-\xFF], а не [А\п] |
и |
PCRE_UNGREEDY |
Минимизировать числитель |
га |
PCRE_MULTILINE |
А, $ учитывают \п |
D |
PCRE_DOLLAR_ENDONLY |
$ не учитывает \п |
А |
PCRE_ ANCHORED |
Привязать шаблон к началу текста |
е |
|
Только для preg_rep!ace() |
X |
PCRE_EXTENDED |
Разрешить комментарии: пробел и # |
X |
PCRE_EXTRA |
Воспринимать неверную подстановку как ошибку |
S |
|
Предварительная оптимизация шаблона перед исполнением |
<
Содержание Назад Вперед