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