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

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

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

торой практики, которая так важна для понимания этого материала. 
Однако я хочу обратить ваше внимание на то, что во многих задачах как раз не 
обя- 
зательно применять регулярные выражения. Так, на
 
<<-[Весь Текст]
Страница: из 287
 <<-