Поддержка интерфейса между скриптом и регулярными выражениями
осуществляется черезследующие функции: 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 - шаблон. Шаблон
это наборсимволов для склейки строк. Этот набор будет вставлен между всеми
элементамимассива. Например, имеем такой массив:
Соответственно, функция implode($a, "***") вернет нам
строку"String1***String2***String3".
$a = explode($c,$s); Функция explode является обратной implode. Она
разбиваетстроку $s используя шаблон $c и помещает элементы в массив $a.
Например, есливзять строку "String1*String2*String3" и выполнить функцию $a
= explode("*",$s),то получим такой массив:
$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 = 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") заменит в заданной
строке все символы "*"на символы "+".