| |
описанное делает тремя строчками:
$str = "Hello, this word is bold!";
if(ereg("<([[:alnum:]]+)>([^<]*)\\1>",$str,$Pockets))
echo "Слово '$Pockets[2]' обрамлено тэгом '<$Pockets[1]>'";
Дополнительные функции
bool eregi(string $expr, string $str [,list &$Matches])
То же, что и ereg(), только без учета регистра символов.
Хотя регистр и не учитывается при поиске, в карманах $Matches все найден-
ные подстроки все же запишутся с точным сохранением регистра букв.
string eregi_replace(string $expr, strint $str, string $strToChange)
То же, что и ereg_replace(), но без учета регистра буквенных символов.
Часть IV. Стандартные функции PHP 308
int quotemeta(string $str)
Часто бывает нужно гарантировать, чтобы в какой-то переменной-строке ни один
символ не мог трактоваться как метасимвол. Этого можно добиться, предварив каж-
дый из них наклонной чертой, что и делает функция quotemeta(). А именно, она
"заслэшивает" следующие символы: . , \\, +, *, ? , [ ^ ] , ( $ ).
Перед | слэш почему-то не ставится. Будьте особо внимательны!
list split(string $pattern, string $string [,int $limit])
Эта функция очень похожа на explode(). Она тоже разбивает строку $string на
части, но делает это, руководствуясь регулярным выражением $pattern. А именно,
те участки строки, которые совпадают с этим выражением, и будут служить
раздели-
телями. Параметр $limit, если он задан, имеет то же самое значение, что и в
функ-
ции explode() — а именно, возвращается список из не более чем $limit элемен-
тов, последний из которых содержит участок строки от ($limit-1)-го совпадения
до
конца строки.
Наверное, вы уже догадались, что функция split() работает гораздо медленнее,
чем
explode(). Однако она, вместе с тем, имеет впечатляющие возможности, в чем мы
очень скоро убедимся. Тем не менее, не стоит применять split() там, где
прекрасно
подойдет explode(). Чаще всего этим грешат программисты, имеющие некоторый
опыт работы с Perl, потому что в Perl для разбиения строки на составляющие есть
только функция split().
list spliti(string $pattern, string $string [,int $limit])
Аналог функции split(), который делает то же самое, только при сопоставлении с
регулярным выражением не учитывается регистр символов.
Примеры использования
регулярных выражений
Какая же книга, описывающая (даже вкратце) регулярные выражения, обходится без
примеров…. Я не буду отступать от установленных канонов, хотя, конечно, понимаю,
что истинная свобода при работе с выражениями достигается только практикой. Не-
которые из следующих ниже примеров выглядят довольно сложно, но, если разо-
браться, смысл чаще всего оказывается на поверхности.
Имя и расширение файла
Задача: для имени файла в $fname установить расширение out независимо от его
предыдущего расширения.
Глава 22. Основы регулярных выражений в формате RegEx 309
Решение:
$fname=ereg_Replace(
'([[:alnum:]])(\\.[[:alnum:].]*)?$',
'\\1.out',
$fname
);
Обратите внимание на довольно интересную структуру этого выражения: мы не мо-
жем просто "привязать" его к концу строки при помощи $, что обусловлено
специфи-
кой работы RegEx. Мы также привязываем начало выражения к любой букве или
цифре, которой оканчивается имя файла.
Имя каталога и файла
Цель: разбить полное имя файла $path на имя каталога $dir и и имя файла $fname.
Средства:
$fname = ereg_Replace(".*[\\/]","",$path);
$dir = ereg_Replace("[\\/]?[^\\/]*$","",$path);
Проверка на идентификатор
Задача: проверить, является ли строка $id идентификатором, т. е. состоит ли она
ис-
ключительно из алфавитно-цифровых символов (чтобы сделать задачу более инте-
ресной, договоримся также, что первым символом строки не может быть цифра).
Решение:
if(eregi("[a-z_][[:alnum:]]*",$id)) echo "Это идентификатор!";
Модификация тэгов
Задача: в тексте, заданном в $text, у всех тэгов заменить в src
расширение
файла рисунка на gif, вне зависимости от того, какое расширение было у него до
этого и было ли вообще.
Решение:
$text=eregi_Replace(
'( ]*src="?[[:alnum:]/\\]*)(\\.[[:alnum:]]*)?',
'\\
|
|