| |
bc, и в
этом
смысле оно эквивалентно сравнению на равенство.
Часть IV. Стандартные функции PHP 304
Существуют еще два мнимых символа, задающих начало и конец слова. Первый из
них обозначается как [[:<:]] и указывает на позицию перед первой буквой очеред-
ного слова. Последний записывается в виде [[:>:]] и сигнализирует о позиции по-
сле последнего символа слова. Под словом здесь понимается фрагмент строки,
удов-
летворяющий выражению [[:alnum:]]+, т. е., любая последовательность из букв и
цифр.
Язык RegEx поддерживает только четыре уже рассмотренных нами мнимых
символа. Этого нельзя сказать о формате PCRE, в котором, наоборот, количе-
ство таких символов доведено до абсурда.
Вот пример использования мнимых символов:
$st=" string ";
if(ereg("[[:<:]]([[:alnum:]]+)[[:>:]]",$st,$Pock))
echo "Найдено слово: $Pock[1]";
Оператор альтернативы
При описании простых символов мы рассматривали конструкцию [...], которая
позволяла нам указывать, что в нужном месте строки должен стоять один из
указан-
ных символов. Фактически, это не что иное, как оператор альтернативы,
работающий
только с отдельными символами (и потому довольно быстро).
Но в языке RegEx есть возможность задавать альтернативы не одиночных символов,
а сразу их групп. Это делается при помощи оператора |.
Вот несколько примеров его работы.
r Выражение 1|2|3 полностью эквивалентно выражению [123], но сопоставление
происходит несколько медленнее.
r Выражению aaa|^a|z$|zzz соответствуют строки, в которых есть подстрока
aaa, либо которые начинаются на a, либо оканчиваются на z, либо, наконец, со-
держат подстроку zzz.
r Выражению abc1|abc22|abc333 соответствуют строки, в которых встречаются
подстроки abc1, abc22 или abc333 (а возможно, и все три одновременно).
Группирующие скобки
Последний пример наводит на рассуждения о том, нельзя ли как-нибудь сгруппиро-
вать отдельные символы, чтобы не писать по несколько раз одно и то же. В нашем
примере строка abc встречается в выражении аж 3 раза. Но мы не можем написать
выражение так: abc1|22|333, потому что оператор |, естественно, пытается приме-
нить себя к как можно более длинной последовательности команд.
Глава 22. Основы регулярных выражений в формате RegEx 305
Именно для цели управления оператором альтернативы (но не только) и служат
груп-
пирующие круглые скобки (...). Нетрудно догадаться по смыслу, что выражение из
последнего примера можно записать с их помощью так: abc(1|22|333).
Конечно, скобки могут иметь произвольный уровень вложенности. Это бывает полез-
но для сложных выражений, содержащих много условий, а также для еще одного
применения круглых скобок, которое мы сейчас и рассмотрим.
"Карманы"
Пока что мы научились только определять, соответствует ли строка регулярному
вы-
ражению и, возможно, предпринимать какие-то действия по замене найденной части
на другую подстроку. Однако на практике часто бывает нужно не просто узнать,
где в
строке имеется совпадение (и что оно из себя представляет), но также и разбить
это
совпадение на части, ради которых, собственно, и велась вся работа.
Вот пример, проясняющий ситуацию. Пусть нам в строке задана дата в формате
DDMM-
YYYY, и в ней могут встретиться паразитные пробелы в начале и конце. Нас
интересует, что же все-таки за дату нам передали. То есть, мы точно знаем, что
эта
строка — именно дата, но вот где в ней день, где месяц и где год?
Посмотрим, что же предлагает нам RegEx и PHP для решения рассматриваемой зада-
чи. Для начала установим, что все правильные даты должны соответствовать выра-
жению
^ *(([0-9]+)-([0-9]+)-([0-9]+)) *$
Для простоты мы не проверяем, что длина каждого поля не должна превышать 2 (для
года — 4) символа. Все строки, не удовлетворяющие этому выражению, заведомо не
являются датами.
Мы не зря ограничили отдельные части регулярного выражения скобками, хотя, на
первый взгляд, можно было бы их опустить. И вот почему: любой блок, обрамленный
в выражении скобками, выделяется как единое целое и записывается в так называе-
мый "карман" (номер кармана соответствует порядку открывающихся скобок). В на-
шем случае в первый карман запишется дата, но уже без ведущих и концевых пробе-
лов (это обеспечивает сам
|
|