Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М2.2.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
110.08 Кб
Скачать

Часть 3: pcre

И вот, наконец, серия выпусков про регулярные выражения подходит к концу. Поговорим о регулярных выражениях совместимых с Perl (Perl compatible regular expressions — PCRE). Самое главное их преимущество перед POSIX, как мне уже подсказывают — возможность "жадного" поиска. Вопросительный знак в PCRE выступает еще и как минимизатор квантификатора: .*?Найдет минимальную подходящую строку. Вроде бы ничего особенного? Нет, это очень особенная вещь. Например, какой пример я приводил в прошлом выпуске про печатную версию текста?

$text = ereg_replace("<a +href=([^>]+)>[^<]+</a>", "\0 [\1]", $text);

То есть, внури ссылки не должно быть тегов (например "<a href=...><b>...</b></a>"). Если же сделать так:

$text = ereg_replace("<a +href=([^>]+)>.*</a>", "\0 [\1]", $text);

Тогда мы получим... Правильно, весь текст между началом первой и концом последней ссылки. Все проблемы снимает жадный поиск.

$text = preg_replace("/<as+href=(.*?)>.*?</a>/", "\0 [\1]", $text);

Программа подберет для всех ссылок минимальную подходящую строку, т.е. только до тега "</a>". Описывать значение такой особенности PCRE нет смыла — оно огромное. :) Идем дальше. Цифры теперь можно обозначить не как "[0-9]", а просто "d". Не-цифры ("[^0-9]") как "D". Очень удобно. Вот остальные обозначения:

w        [a-z0-9]       W        [^a-z0-9]       s        [ ]       S        [^ ]

Рекомендую заглянуть в выпуски про поиск — там эти символы используются. Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. Для чего нужен первый слэш, не знаю. Последний нужен для отделения шаблона от параметров. Параметры, которые я понял, таковы: i регистронезависимый поиск m многостроковый режим. По умолчанию PCRE ищет сопвадения с шаблоном только внутри одной строки, а символы "^" и "$" совпадают только с началом и концом всего текста. Когда этот параметр установлен, "^" и "$" совпадают с началом и концом отдельных строк. s символ "." (точка) совпадает и с переносом строки (по умолчанию — нет) A привязка к началу текста E заставляет символ "$" совпадать только с концом текста. Игнорируется, если установлен парамерт m. U Инвертирует "жадность" для каждого квантификатора (если же после квантификатора стоит "?", этот квантификатор перестает быть "жадным"). Естественно, регистр в параметрах имеет значение. Остальное о них можно прочесть в руководстве по php.

4, Какие функции позволяют использовать регулярные выражения? Синтаксис регулярных выражений. Приведите примеры.

Функции php для работы с регулярными выражениями(posix-совместимые)

В настоящее время РНР поддерживает семь функций поиска с использованием регулярных выражений в стиле POSIX:

  • ereg();

  • ereg_replace();

  • eregi();

  • eregi_replace();

  • split();

  • spliti();

  • sql_regcase().

Описания этих функций приведены в следующих разделах.

ereg()

Функция ereg() ищет в заданной строке совпадение для шаблона. Если совпадение найдено, возвращается TRUE, в противном случае возвращается FALSE. Синтаксис функции ereg():

int ereg (string шаблон, string строка [, array совпадения])

Поиск производится с учетом регистра алфавитных символов. Пример использования ereg() для поиска в строках доменов .com:

$is_com = ereg("(\.)(com$)", $email); // Функция возвращает TRUE, если $email завершается символами ".com" // В частности, поиск будет успешным для строк // "www.wjgilmore.com" и "someemail@apress.com"

Обратите внимание: из-за присутствия служебного символа $ регулярное выражение совпадает только в том случае, если строка завершается символами .com. Например, оно совпадет в строке "www.apress.com", но не совпадет в строке "www.apress.com/catalog".

Необязательный параметр совпадения содержит массив совпадений для всех подвыражений, заключенных в регулярном выражении в круглые скобки. В листинге 8.1 показано, как при помощи этого массива разделить URL на несколько сегментов.

Листинг 8.1. Вывод элементов массива $regs.

$url = "http://www.apress.com"; // Разделить $url на три компонента: "http://www". "apress" и "com" $www_url = ereg("^(http://www)\.([[:alnum:]+\.([[:alnum:]]+)\.(com$)", $url, $regs); if ($www_url) : // Если переменная $www_url содержит URL echo $regs[0]; // Вся строка "http://www.apress.com" print "<br>"; echo $regs[1]; // "http://www" print "<br>"; echo $regs[2]; // "apress" print "<br>"; echo $regs[3]; // "com" endif;

При выполнении сценария в листинге 8.1 будет получен следующий результат:

http://www.apress.com http://www apress com

ereg_replace()

Функция ereg_replace() ищет в заданной строке совпадение для шаблона и заменяет его новым фрагментом. Синтаксис функции ereg_replace():

string ereg_replace (string шаблон, string замена, string строке)

Функция ereg_replace() работает по тому же принципу, что и ereg(), но ее возможности расширены от простого поиска до поиска с заменой. После выполнения замены функция возвращает модифицированную строку. Если совпадения отсутствуют, строка остается в прежнем состоянии. Функция ereg_replace(), как и ereg(), учитывает регистр символов. Ниже приведен простой пример, демонстрирующий применение этой функции:

$copy_date = "Copyright 1999"; $copy_date = ereg_replace("([0-9]+)", "2000", $copy_date); print $copy_date; // Выводится строка "Copyright 2000"

У средств поиска с заменой в языке РНР имеется одна интересная возможность — возможность использования обратных ссылок на части основного выражения, заключенные в круглые скобки. Обратные ссылки похожи на элементы необязательного параметра-массива совпадения функции ereg() за одним исключением: обратные ссылки записываются в виде \0, \1, \2 и т. д., где \0 соответствует всей строке, \1 — успешному совпадению первого подвыражения и т. д. Выражение может содержать до 9 обратных ссылок. В следующем примере все ссылки на URL в тексте заменяются работающими гиперссылками:

$url = "Apress (http://www.apress.com)"; $url = ereg_replace("http://(([A-Za-z0-9.\-])*)", "<a href=\"\\0\">\\0</a>", $url); print $url; // Выводится строка: // Apress (<a href="http://www.apress.com">http://www.apress.com</a>)

eregi()

Функция eregi() ищет в заданной строке совпадение для шаблона. Синтаксис функции eregi():

int eregi (string шаблон, string строка [, array совпадения])

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

$password = "abc"; if (! eregi("[[:alnum:]]{8,10}", $password)) : print "Invalid password! Passwords must be from 8 through 10 characters in length."; endif; // В результате выполнения этого фрагмента выводится сообщение об ошибке. // поскольку длина строки "abc" не входит в разрешенный интервал // от 8 до 10 символов.

eregi_replace()

Функция eregi_replace() работает точно так же, как ereg_replace(), за одним исключением: поиск производится без учета регистра символов. Синтаксис функции ereg_replace():

string eregi_replace (string шаблон, string замена, string строка)

split()

Функция split() разбивает строку на элементы, границы которых определяются по заданному шаблону. Синтаксис функции split():

array split (string шаблон, string строка [, int порог])

Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка слева направо. Если шаблон содержит алфавитные символы, функция split() работает с учетом регистра символов. Следующий пример демонстрирует использование функции split() для разбиения канонического IP-адреса на триплеты:

$ip = "123.345.789.000"; // Канонический IP-адрес $iparr = split ("\.", $ip); // Поскольку точка является служебным символом. // ее необходимо экранировать. print "$iparr[0] <br>"; // Выводит "123" print "$iparr[1] <br>"; // Выводит "456" print "$iparr[2] <br>"; // Выводит "789" print "$iparr[3] <br>"; // Выводит "000"

spliti()

Функция spliti() работает точно так же, как ее прототип split(), за одним исключением: она не учитывает регистра символов. Синтаксис функции spliti():

array spliti (string шаблон, string строка [, int порог])

Разумеется, регистр символов важен лишь в том случае, если шаблон содержит алфавитные символы. Для других символов выполнение spliti() полностью аналогично split().

sql_regcase()

Вспомогательная функция sql_regcase() заключает каждый символ входной строки в квадратные скобки и добавляет к нему парный символ. Синтаксис функции sql_regcase():

string sql_regcase (string строка)

Если алфавитный символ существует в двух вариантах (верхний и нижний регистры), выражение в квадратных скобках будет содержать оба варианта; в противном случае исходный символ повторяется дважды. Функция sql_regcase() особенно удобна при использовании РНР с программными пакетами, поддерживающими регулярные выражения в одном регистре. Пример преобразования строки функцией sql_regcase():

$version = "php 4.0"; print sql_regcase($version); // Выводится строка [Pp][Hh][Pp] 4.0