Поиск

Создание более сложных шаблонов

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

Группирование

С помощью все тех же обычных круглых скобок можно группировать уже зна комые нам основные символы в более сложные шаблоны. Группирование не сложно: (abc) соответствует только записи abc, (trout) только trout. Приве денные примеры достаточно спорны, поскольку abc и так отождествляется только с abc. Только начав использовать метасимволы со скобками, можно уви деть, как группирование влияет на шаблоны.

По существу, использование скобок это способ создания нового литерала. С логической точки зрения, если а литерал, которому соответствует только буква «а», то (abc) это литерал, которому соответствует только запись «abc». Следовательно, метасимволы, соответствующие множеству символов (вы по* мните, что их еще называют умножителями), относятся не только к предше ствующему литералу, но и ко всей группе. Другими словами, если а {3} отожде ствляется с записью «ааа», (abc) {3} равносильно строке abcabcabc. Более наглядный пример: Ьоп+ соответствует фрагменту текста, начинающемуся с буквосочетания «bon», за которым следует одна или больше букв «п» (скажем, bonnet). Однако запись (Ьоп)+ соответствует строке, начинающейся с букв «bon», за которой следует один или больше слогов «bon» (bonbon, например). Скобками выделяется и контролируется группа символов, позволяя создавать настоящие регулярные выражения.

Подобным образом, в то время как запись yes Ino отождествляется с «yeso» или «уепо» (уе плюс s или п, плюс о), то (Yes) I (No) полностью соответствует только одному из этих слов.

Классы

Вне зависимости от того, как вы комбинируете символы и метасимволы в регу лярные выражения, они будут полезны только для поиска конкретных слов. А если необходимо найти все слова, состоящие из четырех строчных букв, или все числа в строке? В этом случае определяются и используются классы (фор мальное название классы символов).

Классы создаются с помощью размещения символов (литералов) в квадрат ных скобках ( [ ] ). Например, можно определить класс из всех гласных англий ского алфавита с помощью записи [ aeiou ] . Допустимо использовать дефис для задания диапазона следующих подряд символов, например: [az] любая строчная буква, [AZ] любая прописная буква, [AZaz] вообще любая бук ва английского языка, [ 0 9 ] любая цифра. Следует отметить, что классы в шаблонах всегда будут отождествляться только с одним символом из класса или диапазона, а такой шаблон, как [az ] { 3 } соответствует группе из 3 любых строчных букв: abc, ааа и т.п. ,

Знак «крышечка», который, как мы уже знаем, обычно привязывает шаблон к началу строки, при задании класса символов в квадратных скобках имеет осо бенное значение. Если знак «крышечка» указан сразу за левой квадратной скоб кой, то «крышечка» используется для исключения группы символов. Так, [ла] соответствует любому знаку, кроме буквы «а», а запись [ Л0Э ] задает любой не цифровой символ. Как вы думаете, что будет обозначать такой класс: [ л\л ] ? Правильно, это любой знак, кроме самой «крышечки».

В РНР есть несколько предопределенных классов, которые можно спокой но использовать при составлении регулярных выражений: [ [ : alpha : ] ] соот ветствует любой букве (аналог [AZaz ] ), [ [ : digit : ] ] любой цифре (эквива лент [09]), [[ :alnum: ] ] любой букве и цифре (также, как и [AZazO9]). Определяя собственные классы символов, а также используя встроенные в РНР (см. табл. С.З приложения С), можно создавать любые шаблоны для об работки текста и получаемой от пользователя информации.

Примеры шаблонов

Изучив предыдущие разделы, вы можете самостоятельно создавать полезные шаблоны. Примеры, приведенные ниже, облегчат вам эту задачу.

Данный шаблон предназначен для проверки правильности ввода почтово го индекса, принятого в США. Индекс должен состоять из пяти цифр, затем могут идти дефис и еще четыре цифры. Начало строки обозначено знаком вставки, а в первых скобках указано, что необходимо именно пять цифр (за классом в фигурных скобках указано количество используемых символов). Во вторых скобках сначала вы видите дефис, затем класс и точное количество используемых символов этого класса. Вопросительный знак показывает, что данная часть индекса необязательна (то есть или еще дефис и 4 цифры, или больше ничего). Знак доллара обозначает, что это конец строки, то есть требу ется, чтобы в строке больше не было никаких символов.

А вот более сложный шаблон для проверки адресов электронной почты:

«Л([09аг]+)([09az\._]+)@([09az\._]+)\.([09az]+) »

Так как для поиска соответствий мы используем только функцию eregi ( ) , следовательно, не стоит беспокоиться о регистре букв, то классы символов бу дут включать только строчные английские буквы.

Вернемся к предыдущему сценарию (листинг 8.2) и зададим более точную формулу для проверки электронного адреса. По сравнению с разобранным выше'примером, в новом скрипте (листинг 8.3) шаблон в переменной $Pattern в конце строки включает пробел. Таким образом, если адрес электронной по чты находится внутри любого другого текста, слова после адреса не включают ся в шаблон.

Листинг 8.3 т В сценарий HandleForm.php был вставлен новый шаблон для комплексной проверки правильности адреса электронной почты.

1 <HTML>
2 <HEAD>
3 <TITLE>Using Regular Expressions</TITLEx/HEAD>
4 <BODY>
5 <?php
6 /* Эта страница получает и обрабатывает данные, принятые
от generated by "form.html". */
7 if (($Array["FirstName"]) AND ($Array["LastName"])) {
8 $Array["Name"] = $Array["FirstName"] . " " .
SArray["LastName"];
9 } else {
10 . print ("Please enter your first and last names.<BR>\n");
11 }
12
13 $Pattern = "A([09az]+)([ 09az\. _]+)<? ([09az\._]+)\. ([09av 14 if (eregi($Pattern, $Array["Email"])) {
15 print ("Your information has been received!<BR>\n"
16 } else {
17 print ("Please enter a valid email address!\n");
18 }
19 ?>
20 </BODY>
21 </HTML>
Обратные ссылки

Понятие «обратная ссылка» станет особенно важным, когда мы начнем извле кать из текста нужные фрагменты, а также будем проводить контекстную заме ну одной подстроки на другую.

Подробно разобранный выше шаблон почтового индекса состоит из двух групп, заключенных в скобки: ([ 09 ] {5}) и ([09]{4}). При сопоставлении регулярного выражения и обрабатываемого текста в РНР автоматически нуме руются заключенные в скобки группы начиная с единицы. Используя обратные ссылки, можно обратиться к каждой отдельной группе символов с помощью двойного обратного слеша (\), поставленного перед соответствующим чис лом. Например, если с помощью этого шаблона проверить почтовый код 947100001, обратная ссылка номер \ \ 1 даст число 94710, а обратная ссылка \ \ 2 будет содержать запись «0001» (конечно, без кавычек. Я взял этот фрагмент в кавычки, только чтобы показать, что дефис является частью шаблона и най денной подстроки). В следующем разделе приведен пример практического ис пользования обратных ссылок.