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

Автор: Topol Воскресенье, Апрель 15th, 2012 Нет комментариев

Рубрика: Программирование

Поддержка интерфейса между скриптом и регулярными выражениями осуществляется черезследующие функции: 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″) заменит в заданной строке все символы «*»на символы «+».

Источник: webcorp.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты