Регулярные выражения в php
Поддержка регулярный выражений является не только достаточно полезной, но и мощной возможностью PHP. Поэтому пусть вас не пугает запутанность этого языка и сложность выражений. Разобрав данный вопрос, вы сможете намного быстрее обрабатывать структурированные данные и тексты.
Например, очень часто это применяется для того, чтобы проверить, насколько строка соответствует тем или иным правилам. Нижеприведенное РВ используется для проверки правильности электронной почты:
/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/
Синтаксис
В наиболее простом виде РВ выглядит таким образом:
abc
Оно соответствует всем строкам, имеющим подстроку "abc".
Выражение в квадратных скобках отличается тем, что скобки ограничивают поиск содержащимися в них символами:
[abc]
Данному РВ соответствуют строки, которые содержат abc – как по отдельности, так и вместе. Содержащееся в скобках выражение также носит название бра-кет выражения.
В том случае, если необходимо создать РВ, которое будет соответствовать буквам русского алфавита, можно или осуществить их перечисление в РВ (занимает много времени и сил) или записать его таким образом:
[а-Я]
Разделяемые дефисом два символа будут задавать соответствие находящемуся внутри диапазону символов, поэтому данное выражение соответствует буквам алфавита. Оно описывает символы и верхнего, и нижнего регистра. Его можно записать более подробно:
[а-яА-Я]
РВ, которые соответствуют числам, можно задать таким же способом:
[0-9]
или
[0123456789]
Данные выражения равнозначны и соответствуют каждой цифре.
Групповой символ
Создавая РВ, воспользуйтесь групповым символом «.». Он осуществляет объединение пары одиночных символов (кроме \n):
.ок
Данное выражение также соответствует таким строкам, как «док», «кок», «ток».
Выражение
x.[0-9]
соответствует той строке, которая содержит символ х (за ним должны идти цифры от 0 до 9 и те или иные символы). Данному критерию удовлетворяют такие строки, как, например, «xz1», «xl2».
Ветви
РВ может содержать некоторое количество ветвей, разделяющихся символом |. Он действует в роли оператора ИЛИ (OR). При использовании в выражении ветвей одна из них должна соответствовать строке "abc|абв".
Данному РВ соответствуют строки, которые содержат подстроки - «абв» или «abc». Обычно ветвление используется для того, чтобы проверить зоны доменов, имен и расширений файлов. Нижеприведенное РВ осуществляет проверку на наличие в строке подстрок «net», «com» и «ru».
ru|com|net
Исключающее выражение
Чтобы исключить из поиска определенную последовательность символов, перед ней необходимо наличие символа «^».
[^а-я]
Данное РВ отвечает символам, не имеющимся в диапазоне а-я. Символ ^ обладает значением «не» только в том случае, если он расположен внутри квадратных скобок. В противном случае он получит другое значение, о котором мы расскажем ниже.
Квалификаторы
Для уточнения РВ вы можете воспользоваться квалификаторами — такими символами, как *, ? +. Они указывают на количество последовательностей символов в строке. Их необходимо указать после части выражения, в которой вам необходимо их использовать:
- “а*” - 0 или > a (данному выражению соответствуют строки «укр», «абв» и «абва»);
- ''a?'' - 0 или 1 а (данному выражению соответствуют строки «укр» и «абв», не соответствуют - «абва»);
- ''a+'' - наличие минимум одного а (данному выражению соответствуют строки «абв» и «абва», не соответствует - «укр»).
Границы
Границы представляют собой числа в фигурных скобках. Они указывают число вхождений выражения в строку фрагмента, которое предшествует границе.
- ''xy{2}'' соответствуют той строке, где два y следуют за x;
- ''xy{2,}'' - той, где за х идут от двух y;
- ''xy{2,6}'' – где за x идет 2-6 y.
Чтобы указать число вхождений последовательности символов, применяются круглые скобки:
- "x(yz){2,6}" соответствует той строке, где за x идет 2-6 последовательностей yz;
- "x(yz)*" - в которой за x идут последовательности y в количестве 0 и более.
Подвыражения
Бывают ситуации, когда РВ должно сообщать что строка «волна» идет за той или иной строкой «морская». В этом случае, используя круглые скобки, РВ необходимо разделить на подвыражения:
(морская)*волна
Данное выражение соответствует таким строкам, как "волна", "морская волна" и проч.
Соответствие началу и концу строки
В РВ вы можете указать, где должно находиться то или иное подвыражение: или и в начале, и в конце, или в начале или конце строки. Началу строки соответствует специальный символ ^:
''^xy''
Подобное выражение соответствует начинающимся с xy строкам. Символ ^ необходимо вынести за пределы выражения:
^[a-z]"
Концу строки соответствует символ $:
xy$
Данное РВ соответствует оканчивающимся на xy строкам.
Сопоставление со специальными символами
Если необходимо сопоставить выражение строке, имеющей специальные символы ({, ^, $) перед ними необходимо поставить черту \. Если вы напишете в РВ ''\$'', то в строке будет найден символ $.
Если перед символом имеется обратная косая черта, то это свидетельствует о том, что для записи символа была использована escape-последовательность.
Это же можно отнести и к символу косой черты. Для сопоставления с этим символом необходимо написать две черты - \\.
Классы символов
Классами символов представляют собой сокращенные названия, предназначенные для предопределенных символов. Перечислим данные классы и символы:
- [[:alnum:]]- буквенно-цифровые;
- [[:digit:]]- десятичные цифровые;
- [[:xdigit:]]- шестнадцатеричные цифровые;
- [[:alpha:]]- буквенные;
- [[:upper:]]- прописные буквенные;
- [[:lower:]]- строчные буквенные;
- [[:punct:]]- знаки пунктуации
- [[:space:]]- пробел;
- [[:blanc:]]- табуляция и пробел;
- [[:print:]]- печатные;
- [[:cntrl:]]- управляющие;
- [[:graph:]]- печатные символы (кроме пробелов).
В РВ классы символов используются наравне с остальными символами:
- "[a-zA-Z_0-9]" эквивалентно "[[:alnum:]]";
- "[0-9]" эквивалентно "[[:digit:]]";
- "[a-Z]" эквивалентно РВ "[[:alpha:]]".
Функции для работы с регулярными выражениями
В PHP есть поддержка 2 типов записи РВ — POSIX и Perl. POSIX (Portable Operating System Interface) представляет собой интерфейс переносной операционной системы и стандарт для интерфейсов приложений. Сейчас мы рассмотрим РВ POSIX и Perl-совместимые РВ.
Скорость выполнения функций для работы с РВ ниже строковых функций, которые обладают аналогичными возможностями. По этой причине лучше использовать строковые функции — если, конечно, ущерба эффективности не наносится.
ereg()
bool ereg(string pattern, string string [, array regs])
Эта функция осуществляет поиск соответствия РВ в строке string, который задан в шаблоне pattern. В случае наличия соответствий шаблона с подвыражениями их сохранят в массиве соответствий regs. В $regs[0] имеется копия строки string, а в $regs[1] находится подстрока, которая начинается с первой левой скобки. Подстрока со второй левой скобки хранится в $regs[2] и т. д.
Рассмотрим код, который из формата YYYY-MM-DD преобразовывает формат даты в DD.MM.YYYY.
<? $date = "2015-03-21"; if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)){ echo "$regs[3].$regs[2].$regs[1]"; } else{ echo "Неверный формат даты: $date"; } ?>
ereg_replace()
string ereg_replace(string pattern, string replacement, string string)
Данная функция меняет шаблон pattern, который был обнаружен в строке string, на строку replacement. При наличии соответствия происходит осуществление модифицированной строки.
Будьте внимательны: указание числа как типа, который отличен от строкового, является ошибкой — число должно всегда указываться как строка.
<? $number = "1952"; $str = "Он родился в пятьдесят втором."; echo("до замены:$str"); $str = ereg_replace("пятьдесят втором", $number, $str); echo("<br> после замены: $str"); ?>
Результат:
до замены: Он родился в пятьдесят втором.после замены: Он родился в 1952.
eregi()
bool eregi (string pattern, string string[, array regs])
Данная функция аналогична ereg. Отличие состоит в том, что регистр игнорируется.
eregi_replace()
string eregi_replace (string pattern, string replacement, string string)
Отличие данной функции от ereg_replace состоит в том, что она не является чувствительной к регистру.
split()
array split (string pattern, string string [, int limit])
Данная функция проводит возвращение массива строк из подстрок строк string, которые были образованы в соответствии с РВ pattern в ходе разделения строки string на подстроки. При указании параметра limit (он не является обязательным) возвращаемый массив будет иметь до limit элементов, причем в последнем имеется неразделенная часть строки.
Данная функция окажет пользу при разделении доменных имен, дат и проч. Например:
<? $url = "www.softtime.ru"; $array = split ("\.", $url); foreach($array as $index => $val) { echo("$index -> $val <br />"); }?>
В результате будет следующее:
0 -> www 1 -> softtime 2 -> ru
Это же можно осуществить и с датой:
<? $date = "10-12-2003" $array = split ("-", $date); foreach($array as $index => $val){ echo("$index -> $val <br />"); } ?>
В результате мы получим:
0 -> 10 1 -> 12 2 -> 2015
spliti()
array spliti (string pattern, string string [, int limit])
Данная функция похожа на split, однако не является чувствительной к регистру.
Оставить комментарий