Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
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) символа. Все строки, не удовлетворяющие этому выражению, заведомо не 
являются датами. 
Мы не зря ограничили отдельные части регулярного выражения скобками, хотя, на 
первый взгляд, можно было бы их опустить. И вот почему: любой блок, обрамленный 

в выражении скобками, выделяется как единое целое и записывается в так называе- 

мый "карман" (номер кармана соответствует порядку открывающихся скобок). В на- 
шем случае в первый карман запишется дата, но уже без ведущих и концевых пробе- 

лов (это обеспечивает сам
 
<<-[Весь Текст]
Страница: из 287
 <<-