PHP. Регулярные выражения

Автор статьи: Дмитрий ©
Сайт Автора: runweb.ru
E-mail Автора: dmitry@runweb.ru
Дата публикации: 04.03.2006

Поддержка интерфейса между скриптом и регулярными выражениями осуществляется через
следующие функции: split(), ereg(), ereg_replace(). (доп. редактора). Первым
аргументом для всех трех функций - это строка, задающая регулярное выражение. Этот
строка состоит из регулярных и специальных символов. Регулярные символы имеют то
же значение что и при в других командах Unix, в то время как специальные символы
имеют специальное значение. Далее следуюет - полный список специальных символов и
их значения как это воспринимает синтаксический анализатор PHP:

.' Является специальным символом, который соответствует любому символу, за
исключением символа новой строки. Используя конкатенацию, мы можем задавать
регулярные выражения подобно 'a.b', которое соответствует любой трех-символьной
строке, которая начинается с 'a' и заканчивается 'b'.

*' Сам по себе это не конструкция; это - суффикс, который означает, что
предшествующее регулярное выражение, может быть повторено сколь угодно много раз.
В строке "fo*", символ "*" применяется к символу "o', так "fo*" задает "f" с
последующим любым количеством символов "o".

В случае нулевого количества символов "o" строка "fo*" будет также
соответствовать "f".

Символ "*" Всегда применяет к *наименьшему* возможному предшествующему
выражению. Таким образом, "fo*" задает повторение "o", а не повторение "fo".

Процесс сравненияr обрабатывает конструкцию "*", пытаясь согласовать настолько
много повторений насколько много их их может быть найдено. Затем он продолжает
обработку остальной части шаблона. Если, впоследствии, появится несоответсвтие с
шаблогам, происходит возврат, путем отбрасывания некоторых повторений "*", в
случае, если это делает возможным совпадение остальной части шаблона. Например,
шаблон "c[ad]*ar" для строки "caddaar", "[ad]*" сначала совпадает с "addaa", но
это не позволяет совпасть следующему символу "a" в шаблоне. Так последнее
совпадение "[ad]" отменяутся, и следующий символ "a" пробуется вновь. Теперь
шаблон сооветствует.

+' "+" Подобен "*" за исключением того, что требуется по крайней мере одно
соответствие для предшествующего образца. Таким образом, "c[ad]+r" не совпадает с
"cr", но совпадет с чем либо еще что может быть задано шаблоном "c[ad]*r".

?' "?" Подобен "*" за исключением того, что позволяет задать нуль или более
соответствий для заданного шаблона. Таким образом, шаблон "c[ad]?r" будет задавать
строки "cr" или "car" или "cdr", и ничего больше.

[ ... ]' "[" начинает "множество символов", которое завершается символом "]".
В самом простом случае, символы между этими двумя скобками формируют множество.
Таким образом, "[ad]" задает символы "a" или "d", и "[ad]*" задает любоую п
оследовательность символов "a" и "d" (включая и пустую строку), из чего следует,
что шаблон "c[ad]*r" задает "car", и т.д.

Диапазон символов также может быть включен в множество символов, с помощью
символа "-", помещенного между двумя другими. Таким образом, шаблон "[a-z]" задает
любой символ нижнего регистра. Диапазоны могут свободно перемежаться с одиночными
символами, как в шаблоне "[a-z$%.]", который задает любой символ нижнего регистра
или символы "$", "%" или точку.

Обратите внимание, что символы, обычно являющиеся специальными, внутри
множества символов больше не являются таковыми. Внутри множества символов
существует полностью отличный набор специальных символов : "]", "-" и "^".

Для того чтобы включить "]" в множество символов, нужно сделать его первым
символом. Например, шаблон "[]a]" задает символ "]" или "a". Чтобы включить символ
"-", нужно использовать его в таком контексте, где он не может указывать диапазон:
то есть или первым символом, или сразу после диапазона.

[^ ... ]' "[^" начинает "исключающее множество символов", который задает любой
символ за исключением заданных. Таким образом, шаблон "[^a-z0-9A-Z]" задает любой
символ *за исключением* букв и цифр. "^" не является специальным символом в
множестве, если только это не первый символ. Символ следующий после "^"
обрабатывается так, как будто он является первым (это может быть "-" или "]").

^' Является специальным символом, который задает пустую строку - но только в
случае если он стоит в начале строки шаблона. Иначе шаблон не будет
соответствовать. Таким образом, шаблон "^foo" задает "foo" в начале строки.

$' Подобен "^", но только задает конец строки. Так шаблон, "xx*$" задает
строку с одним или более символом "x" в конце строки.

\' Имеет два значения: экранирует вышеперечисленные специальные символы
(включая "\"), и задает дополнительные специальные конструкции.

Так как "\" экранирует специальные символы, "\$" является регулярным
выражением, задающим только символ "$", а "\[" является регулярным выражением,
задающим только "[", и так далее.

В основном, "\" с последующим любым символом соответствует только этому
символу. Однако, есть некоторые исключения: символы, который, когда "\"
предшествует специальная конструкция. Такие символы обычно всегда задают их
собственное значение.

Никакие новые специальные символы не определены. Все расширения к синтаксису
регулярных выражений сделаны, определением новые двух-символьных конструкций,
которые начинаются с "\".

\|' Задает альтернативу. Два регулярных выражения A и B с "\|" между ними
формируют выражение, которое задает что-либо чему соответствует или А или B.

Так выражение, "foo\|bar" или "foo" или "bar", но никакую другую строку.

"\|" применяется к максимально большим окружающим выражениям. Только "\(...\)"
вокруг выражений могут ограничивать мощность "\|".

Существует полная возможность перебора с возвратами , когда задано множество
"\|".

\( ... \)' является конструкцией группирования , которая служит трем целям: 1.
Заключать в себя множество "\|" альтернатив для других операций. Так, шаблон
"\(foo\|bar\)x" соответствует или "foox" или "barx".

2. Включать сложное выражение для постфиксного "*". Так шаблон "ba\(na\)*"
задает "bananana", и т.д., с любым (ноль или болеее ) количеством "na".

3. Отметить искомую подстроку для последующего обращения.

Эта последняя функция - не следствие идеи относительно группировки выражений
скобками; это - отдельная особенность, которая задает второе значение для той-же
самой конструкции "\(...\)" , так как нет практически никакого конфликта между
этими двумя значениями. Вот объяснение этой особенности:

\DIGIT' После окончания конструкции "\(...\)" , анализатор запоминает начало и
конец текста, совпавшего с этой конструкцией. Затем, позднее в регулярном
выражении можно использовать "\" с поледующей цифрой (DIGIT), что означает "задать
тот же самый текст, который соответствовует DIGIT нахождению в конструкции
'\(...\)'". "\(...\)" конструкции пронумерованы в порядке возрастания в регулярном
выражении.

Строкам задающим первые девять конструкций "\(...\)" , появляющимся в
регулярном выражении - соответствуют числа от 1 до 9. "\1" до "\9" может быть
использовано для обращения к тексту, соответствующей "\(...\)" конструкции. Эти 9
сохраненных конструкций известны также как регистры.

Например, шаблон "\(.*\)\1" задает любую строку, который состоит из двух
идентичных частей. "\(.*\)" задает первую часть, которая может быть всем чем
угодно, но последующая "\1" задает точно тот же тексту.

Сохраненные конструкции или регистры могут использоваться внутри одиночных
выражений, или, они могут быть извлечены и использоваться где-либо еще. Добавление
третьего параметра к reg_match() или reg_search() определит массив, в который
будут записаны 9 регистров. При этом записывается дополнительный регистр (нулевой
элемент) в котором задана строка совпавшая со всем выражением. Например:

<?$string = "This is a test"; $cnt = reg_match("\(\w*\).*\(\") echo $cnt; echo
$regs[0]; echo $regs[1]; echo $regs[2]; >

Вышеупомянутое сначала напечатает количество совпавших символов (14 в этом
случае) и затем всю совпавшую строку, споследующим первым словом строки и
последним.

\b' Задает пустую строку, но только, если она находится в начале или в конце
слова. Таким образом, "\bfoo\b" соответствует любому местонахождению "foo" в виде
отдельного слова. "\bball\(s\|\)\b" соответствует "ball" или "balls" в виде
отдельных слов.

\B' Задает пустую строку, если она не в начале или не в конце слова.

\<' Задает пустую строку, но только, если она - в начале слова.

\>' Задает пустую строку, но только, если она в конце слова.

\w' Задает любой символ, являющийся составной частью слова.

\W' Задает любой символ, который - не является составной частью слова.


--------------------------------------------------------------------------------
Основные функции работы с массивами и строками Сегодня я расскажу вам о регулярных
выражениях, а также о главных функциях работы со строками и массивами. В этом
разделе Вы познакомитесь с функциями. С помощью этих функций можно производить
замену определенных элементов строки, осуществлять поиск в строке, работать с
заданными шаблонами и многое другое. Функций не очень много, но некоторые их них
могут представлять определенные трудности при работе, так как имеют множество
различных параметров. Сегодня я познакомлю вас с основными параметрами, которые
позволяют производить главные действия. Итак, рассмотрим эти функции по порядку.

$s = implode($a,$c); Мы уже познакомились с этой функцией в прошлом выпуске.
Она позволяет соединять все элементы массива в одну строку. Здесь $s - строка, в
которую будет помещен результат, $a - массив, $c - шаблон. Шаблон это набор
символов для склейки строк. Этот набор будет вставлен между всеми элементами
массива. Например, имеем такой массив:

$a[0] = "String1"; $a[1] = "String2"; $a[2] = "String3";

Соответственно, функция implode($a, "***") вернет нам строку
"String1***String2***String3".

$a = explode($c,$s); Функция explode является обратной implode. Она разбивает
строку $s используя шаблон $c и помещает элементы в массив $a. Например, если
взять строку "String1*String2*String3" и выполнить функцию $a = explode("*",$s),
то получим такой массив:

$a[0] = "String1"; $a[1] = "String2"; $a[2] = "String3";

$a = split($c,$s); Работа фунции абсолютно идентична explode, за тем
исключением, что в ней можно использовать регулярные выражения. Это означает, что
уже нельзя для простой разбивки строки использовать символ "*", так как он
является регулярным выражением (см. раздел выше). Поэтому для разбивки строки
можно использовать какий-нибудь другой символ, например, "~".

ereg($c,$s); Функция ereg возвращает истину, если в строке $s найдено
соответствие регулярному выражению $c. $c здесь это любой набор описанных в
предыдущем разделе регулярных выражений. Например, мы имеем строку $s = "Here is
testing string". Функция ereg("^Here.*",$s) вернет истину, так как в регулярном
выражении указывается, что слово Here должно быть в начале строки (спец. символ
"^" указывает на это), а после этого слова могут идти любые символы (конструкция
".*"). Вот пример программы, которая проверяет это соответствие:

<? $s = "Here is testing string"; if (ereg("^Here.*",$s)) echo "Найдено!";
else echo "Не найдено."; ?>

А вот небольшой пример, который ищет шаблон в любой части слова: <? $s = "Here
is testing string"; if (ereg(".*testing.*",$s)) echo "Найдено!"; else echo "Не
найдено."; ?>

$s = ereg_replace($c,$c1,$s); Эта функция заменяет все символы в строке $s,
подходящие под регулярное выражение $c на символы $c1. Вот пример, в котором мы
заменяем все цифры в строке на знаки "+":

<? $s = "1 Here 2 is 3 testing 4 string 5"; $s = ereg_replace("[0-9]","+",$s);
echo $s; ?>

Как видите, функция возвращает результат в заданную переменную. $s =
str_replace($c,$c1,$s); Работа функции аналогична ereg_replace, за тем
исключением, что в параметре $c нельзя использовать регулярные выражения. Эту
функцию можно использовать, когда у вас нет сложного шаблона для замены, а нужно
произвести простой поиск и замену нескольких символов. Например, функция $s =
str_replace("*", "+", "Str1*Str2*Str3") заменит в заданной строке все символы "*"
на символы "+".