Главная Новости

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


Опубликовано: 01.09.2018

видео Регулярные выражения в php

PHP. Регулярные выражения. Урок 1. Введение и общие понятия. (Андрей Кудлай - Webformyself)

Поддержка регулярный выражений является не только достаточно полезной, но и мощной возможностью PHP. Поэтому пусть вас не пугает запутанность этого языка и сложность выражений. Разобрав данный вопрос, вы сможете намного быстрее обрабатывать структурированные данные и тексты.



Например, очень часто это применяется для того, чтобы проверить, насколько строка соответствует тем или иным правилам. Нижеприведенное РВ используется для проверки правильности электронной почты:

/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/

Синтаксис

В наиболее простом виде РВ выглядит таким образом:


php для начинающих: Регулярные выражения, урок 35!

abc

Оно соответствует всем строкам, имеющим подстроку "abc".

Выражение в квадратных скобках отличается тем, что скобки ограничивают поиск содержащимися в них символами:

[abc]

Данному РВ соответствуют строки, которые содержат abc – как по отдельности, так и вместе. Содержащееся в скобках выражение также носит название бра-кет выражения.


022. Регулярные выражения - Максим Ширшин

В том случае, если необходимо создать РВ, которое будет соответствовать буквам русского алфавита, можно или осуществить их перечисление в РВ (занимает много времени и сил) или записать его таким образом:

[а-Я]

Разделяемые дефисом два символа будут задавать соответствие находящемуся внутри диапазону символов, поэтому данное выражение соответствует буквам алфавита. Оно описывает символы и верхнего, и нижнего регистра. Его можно записать более подробно:

[а-яА-Я]

РВ, которые соответствуют числам, можно задать таким же способом:

[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, однако не является чувствительной к регистру.

rss