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

Автор статьи: Дмитрий ©
Сайт Автора: нет
E-mail Автора: dmitry@runweb.ru
Дата публикации: 22.01.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 istesting string". Функция ereg("^Here.*",$s) вернет истину, так как в регулярномвыражении указывается, что слово Here должно быть в начале строки (спец. символ"^" указывает на это), а после этого слова могут идти любые символы (конструкция".*"). Вот пример программы, которая проверяет это соответствие:

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

А вот небольшой пример, который ищет шаблон в любой части слова:

<?
$s = "Hereis 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") заменит в заданной строке все символы "*"на символы "+".