| |
.jpg',
$text
);
Часть IV. Стандартные функции PHP 310
Преобразование гиперссылок
Задача: имеется текст, в котором иногда встречаются подстроки вида
протокол://URL, где протокол — один из протоколов http, ftp или gopher, а URL —
какой-нибудь адрес в Интернете. Нужно заместить их на HTML-эквиваленты ….
Решение:
$w="[:alnum:]";
$p="[:punct:]";
$text=eregi_Replace(
"((https?|ftp|gopher)://". // протокол
"[$w-]+(\\.[$w-]+)*". // имя хоста
"(/[$w+&.%]*(\\?[$w?+&%]*)?)?". // имя файла и параметры
")",
'\\1',
$text
);
Преобразование адресов E-mail
Задача: имеется текст, в котором иногда встречаются строки вида
пользователь@хост, т. е. E-mail-адреса в обычном формате (или хотя бы большин-
ство таких E-mail). Необходимо преобразовать их в HTML-ссылки.
Решение:
$text=eregi_Replace(
'([[:alnum:]-.]+@'. // пользователь
'[[:alnum:]-]+(\\.[[:alnum:]-]+)*'. // домен
'(\\?([[:alnum:]?+&%]*)?)?'. // необязательные параметры
')',
'\\1',
$text
);
Этот пример, хоть и не безупречен, но все же преобразует правильно львиную долю
адресов электронной почты.
Глава 22. Основы регулярных выражений в формате RegEx 311
Выделение всех уникальных
слов из текста
Задача: перед нами некоторый довольно длинный текст в переменной $text. Необ-
ходимо выделить из него все слова и оставить из них только уникальные.
Результат
должен быть представлен в виде списка, отсортированного в алфавитном порядке.
Решение этой задачи может потребоваться, например, при написании индексирующей
поисковой системы на PHP.
Решение: воспользуемся функцией split() и ассоциативным массивом.
Листинг 22.1. Отбор уникальных слов
// Эта функция выделяет из текста в $text все уникальные слова и
// возвращает их список, отсортированный в алфавитном порядке.
function GetUniques($text)
{ // Сначала получаем все слова в тексте
$Words=split("[[:punct:][:blank:]]+",$text);
$Uniq=array(); // список уникальных слов
$Test=array(); // хэш уже обработанных слов
// Проходимся по всем словам в $Words и заносим в $Uniq уникальные
foreach($Words as $v) {
$v=strtolower($v); // в нижний регистр
// Слово уже нам встречалось? Если нет, то занести в $Uniq
if(!@$Test[$v]) $Uniq[]=$v;
// Указать, что это слово уже обрабатывалось
$Test[$v]=1;
}
// Наконец, сортируем список
sort($Uniq);
return $Uniq;
}
Данный пример довольно интересен, т. к. он имеет довольно большую функциональ-
ность при небольшом объеме. Его "сердце" — функция split() и цикл перебора
слов с отбором уникальных. Мы используем алгоритм, основанный на применении
ассоциативного массива для отбора уникальных элементов. Как он работает — наде-
юсь, ясно из комментариев.
Теперь мы можем воспользоваться функцией из листинга 22.1, например, в таком
контексте:
$fname="sometext.txt";
Часть IV. Стандартные функции PHP 312
$f=fopen($fname,"r");
$text=fread($f,filesize($fname));
fclose($f);
$Uniq=GetUniques($text);
foreach($Uniq as $v) echo "$v ";
Интересно будет отметить, что функция preg_split(), которая работает с
регулярными выражениями в формате PCRE, и которую мы не рассматриваем
в этой книге, показывает гораздо лучшую производительность в этом примере,
чем split() — чуть ли не в 3 раза быстрее! Если вам нужна максимальная
производительность, пожалуй, будет лучше воспользоваться именно ей, но
прежде почитайте что-нибудь о Perl и его регулярных выражениях — напри-
мер, в замечательной книге Perl Cookbook Тома Кристиансена и Ната Торкинг-
тона (русское издание: "Библиотека программиста. Perl", издательство Питер,
2000).
Заключение
Конечно, можно придумать и еще множество примеров применения регулярных вы-
ражений. Вы наверняка сможете это сделать самостоятельно — особенно после неко-
торой практики, которая так важна для понимания этого материала.
Однако я хочу обратить ваше внимание на то, что во многих задачах как раз не
обя-
зательно применять регулярные выражения. Так, на
|
|