РНР 5 в подлиннике

Страница 227 из 554


Гпава 24. Основы регулярных выражений в формате PCRE

459

строки, в которых встречается последовательность at — в середине ли слова, в начале — не важно:

echo preg_replace('/at/', 'AT', "What is the Perl Compatible Regex?");

В результате будет выведена строка:

WhAT is the Perl CompATible Regex?

Если в строку необходимо вставить управляющий символ (например, *), нужно поставить перед ним \, чтобы отменить его специальное действие. Давайте еще раз на этом остановимся — для закрепления. Как вы знаете, для того чтобы в какую-то строку вставить слэш, необходимо его удвоить. То есть мы не можем (вернее, не рекомендуется) написать

$re = "/а\*Ь/"

но можем

$re = "/а\\*Ь/"

В последнем случае в строке $ге оказывается /а\*ь/. Так как регулярные выражения в РНР представляются именно в виде строк, то необходимо постоянно помнить это правило.

Классы символов

Существуют несколько спецсимволов, обозначающих сразу класс букв. Эта возможность — один из краеугольных камней, основ регулярных выражений.

Самый важный из таких знаков — точка (".") — обозначает один любой символ. Например, выражение /а.ь/s имеет совпадение для строк azb или aqb, но не "срабатывает", скажем, для aqwb или аь. Позже мы рассмотрим, как можно заставить точку обозначать ровно два (или, к примеру, ровно пять) любых символов.

В PCRE (в отличие от POSIX) существует еще несколько классов:

□ \s — соответствует "пробельному" символу: пробелу (" "), знаку табуляции (\t), переносу строки (\п) или возврату каретки (\г);

□ \s — любой символ, кроме пробельного;

□ \w — любая буква или цифра;

□ \w — не буква и не цифра;

□ \d — цифра от 0 до 9;

□ \d — все, что угодно, но только не цифра.

Альтернативы

Но это далеко не все. Возможно, вы захотите искать не" произвольный символ, а один из нескольких указанных. Для этого наши символы нужно заключить в квадратные скобки. К примеру, выражение /a[xXyY]c/ соответствует строкам, в которых есть подстроки из трех символов, начинающиеся с а, затем одна из букв х, х, у, y и, наконец, буква с. Если нужно вставить внутрь квадратных скобок символ [ или ], то следует просто поставить перед ним обратный слэш (напоминаем, в строках РНР — два слэша), чтобы отменить его специальное действие.

460

Часть IV. Стандартные функции РНР

Если букв-альтернатив много, и они идут подряд, то не обязательно перечислять их все внутри квадратных скобок — достаточно указать первую из них, потом поставить дефис и затем — последнюю. Такие группы могут повторяться. Например, выражение /[a-z]/ обозначает любую букву от а до z включительно, а выражение /[a-zA-z0-9_] / задает любой алфавитно-цифровой символ.

Существует и другой, иногда более удобный способ задания больших групп символов. В языке PCRE в скобках [ и ] могут встречаться не только одиночные символы, но и специальные выражения. Эти выражения определяют сразу группу символов. Например, [:ainum:] задает любую букву или цифру, а [:digit:] — цифру. Вот полный список таких выражений:

[:alpha:]

— буква;

[:digit:]

— цифра;

[:alnum:]

— буква или цифра;

[:space:]

— пробельный символ;

[:blank:]

— пробельный символ или символы

[:cnrtl:]

— управляющий символ;

[:graph:]

— символ псевдографики;

[:lower:]

— символ нижнего регистра;

!:upper:]

— символ верхнего регистра;

!:print:]

— печатаемый символ;

::punct:]

— знак пунктуации;

: :xdigit:

] — цифра или буква от а до f.

Как видим, все эти выражения задаются в одном и том же виде — [:что_то-.]. Обратите еще раз внимание на то, что они могут встречаться только внутри квадратных скобок. Например, допустимы такие регулярные выражения:

'/аЬс[[:alnum: ]]+/' # abc, затем одна или более буква или цифра

'/аЬс[[:alpha:][:punct:]0]/' # abc, далее буква, знак пунктуации или 0

но совершенно недопустимо следующее:

'/abc[:alnum: ]+/' # не работает!

Внутри скобок [] также можно использовать сим волы-классы, описанные в предыдущем подразделе. Например, допустимо выражение:

■/abc[\w.]/'

Оно ищет подстроку "abc", после которой идет любая буква, цифра или точка.

Внутри скобок [] точка теряет свой специальный смысл ("любой символ") и обозначает просто точку, поэтому не ставьте перед ней слэш!

ь

Отрицательные классы

Когда альтернативных символов много, довольно утомительно перечислять их все в квадратных скобках. Особенно обидно выходит, если нас устраивает любой символ,




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006