Регулярные выражения match. PHP (регулярное выражение) - что это такое? Примеры и проверка регулярных выражений

14.07.2019

) я показал вам пример использования регулярных выражений для нахождения определенных кусков исходного кода страницы. Сейчас же мы с вами научимся писать их самостоятельно. Данный навык поможет писать , очищать текст от ненужных фрагментов, искать нужные части в больших объемах текста и так далее.

Эта тема довольно непроста, но я постараюсь в краткой форме осветить самые важные моменты. Не знаю насколько это у меня получится, но надеюсь польза от урока будет.
Итак, начнем с того, что для работы с регулярными выражениями в PHP существует несколько функций, но чаще всего используются три:

  • preg_replace — поиск и замена подходящего по регулярному выражению текста;
  • preg_match — просто поиск по регулярке;
  • preg_split — поиск и разделение текста.

По крайней мере, в предыдущих уроках мы пользовались именно ими. Вернее, вместо preg_match был preg_match_all, но это по сути тоже самое, только последний не прерывает поиск после первого нахождения. То есть, если использовать preg_match, то мы не найдем все вхождения, а лишь только первое.

Выбор в какой ситуации какую функцию использовать довольно простой. Нужно заменить — используем replace, как в случае когда нам нужно было удалить ненужные части кода страницы, помните?

$page = preg_replace("/^]/i", "", $page); $page = preg_replace("/^]/i", "", $page); $page = str_replace("", "", $page);

Первый параметр функции — регулярка, определяющая Что мы ищем. Второй — на что заменяем. Третий — Где ищем. Следовательно, здесь мы брали переменную $page и присваивали ей результат функции preg_replace где искали все input type=checkbox, а также открывающиеся и закрывающиеся label. Заменяли их на », то есть просто удаляли. Надеюсь тут все ясно. К разбору самого выражения (первого параметра функции) мы перейдем чуть позже.
Был и пример использования preg_match_all, который пригодился для поиска всех ссылок в оставшемся тексте. Ссылки нам тогда понадобились потому, что именно в них были заключены ключевые слова, которые мы парсили. Вот что было:

Preg_match_all("/]+?>(.*?)<\/a>/uis",$page,$ok); for ($j=0; $j".$ok[$j].""; }

Первым параметром опять же является регулярка, чтобы найти все ссылки, которые, естественно заключены в тег «a» (если не дружите с html разметкой, то почитайте ). Второй — переменная в которой содержится текст, по которому будет происходить поиск. Третьим параметром поставлена переменная, в которую помещается результат — $ok. После этого лишь остается пройтись по всем нужным элементам $ok, чтобы достать нужные нам ключевые лова. Отдельно нужно сказать, что на выходе мы получаем многомерный массив. Именно поэтому мы выводили его таким сложным способом: $ok[$j]. Чтобы посмотреть структуру массива воспользуйтесь функцией ниже и вы все поймете.

Print_r($ok);

Вот, вроде бы, с функциями, которые мы использовали для работы, разобрались. Теперь остается только научиться писать эти самые регулярные выражения, которые являются первым параметром каждого из этих методов. Переходим к самому важному.

Как же писать регулярки

Для начала разберем основные конструкции. У выражений есть опции. Они задаются одной буквой и пишутся в конце, перед ними ставится слеш.

Кроме этого поддерживаются следующие метасимволы:

Метасимволы, в свою очередь, могут иметь модификаторы:

Что же, теперь можем перейти к разбору наших регулярок из прошлого урока. Опираясь на таблички выше попробуем понять, что же у нас есть. Вот выражение:

/^]/i

Первый и последний слеши «/» показывают, что внутри них идет регулярное выражение. При этом, после последнего мы поставили «i», это опция, как в первой таблице — не учитывать регистр. Внутри слешей сама регулярка. Она начинается со знака меньше и тега input, а также все, что идет потом, до знака точки — простой текст, который нужно искать. А вот сама точка, и символы после нее — это уже интереснее. В данном случае, конструкция «.*?» означает любую последовательность символов. То есть, если объединить просто текст и данную конструкцию, то мы выберем весь текст после первого вхождения и до конца. Чтобы остановиться нужно встретить либо закрывающийся html тег «больше», либо символ начала новой строки. Эта конструкция как раз нам и дает такую возможность:

Символы в квадратных скобках как бы соединены логическим ИЛИ. Концом является знак «больше» ИЛИ начало строки.
Вот и все выражение, в нем мы задали условие начала, середину и условие окончания. Не трудно, правда? Вот иллюстрация для пущей наглядности:

Давайте разберем еще одно, чтобы все закрепить. Им мы искали ссылки:

/]+?>(.*?)<\/a>/uis

Читаем выражение. Опять же, сначала отбрасываем слеши и опции. Флаги «uis» понятны, за исключением «u», который я не описывал — он показывает, что мы используем кодировку Юникод. Остается не так много. Началом является тег «a», который открывается, затем идет класс

который обозначает НЕ больше или меньше (открывающий и закрывающийся html теги), то есть любые символы в данном случае. К классу добавляется «+?», которые означают, что этот класс будет присутствовать 1 или большее число раз (но хотя бы 1 раз точно). И потом идет закрывающийся html тег для тега «a». Внутри ссылки есть текст, который задается группой

Ведь мы не знаем что там будет за текст, поэтому определяем такую группу. И в конце закрывающийся тег «a»:

Обратите внимание, что слеш мы экранируем с помощью обратного слеша, чтобы он воспринимался как простой текст.

Фух. Тема действительно достаточно сложная, тут нужна практика. Возможно я что-то делаю не вполне оптимально и можно составить другие, более правильные регулярные выражения, но я такой же самоучка как и вы, поэтому не судите строго, а лучше поделитесь своими вариантами в комментариях. Также, если что-то не понятно — комментарии и страница контактов к вашим услугам.

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

Правила составление шаблона (pattern)

Границы шаблона должны обозначаться определенными символами, часто используют "/ ", но я предпочитаю использовать "# " потому, что от обилия прямых/обратных слешей может в глазах зарябить, а "решетки" обычно больше нигде не используются. Итак: "#ТутТелоРегулярногоВыражения# "

Внутри регулярного выражения используются скобки - это подвыражения, с которыми можно производить манипуляции, пример:

#^/catalog/(+)/(+)\.html.*#

Это выражение предназначено для получения параметров в строке URL . В начале строки идет спецсимвол "^ " - это означает начало строки. Далее идет "/catalog/ " - тут нет спецсимволов, это просто текст, который должен содержатся в строке. Затем встретили круглые скобки, т.е. дошли до первого подвыражения. В квадратных скобках обозначаются множество символов, которые могут быть в строке в этом месте. Знак "- " означает перечисление. Знак "\ " экранирует специальные символы. Таким образом, в первом подвыражении у нас могут идти БОЛЬШИЕ и маленькие буквы латинского алфавита, цифры от 0 до 9, знак подчеркивания, тире и точка. Тире и точка - это спецсимволы, но здесь они экранированы, поэтому здесь это просто символы. После квадратных скобок идет знак "+ " - это значит предыдущий символ (а у нас это множество символов заданное в квадратных скобках) может идти 1 или больше раз. Затем идет "/ " - это просто символ, и аналогичное второе подвыражение. Затем идет "\.html ", что означает текст ".html ". А затем спец символы ".* " точка означает любой символ, а звездочка любое количество предыдущего символа. Т.е. после ".html " может идти все что угодно.

Указание количества, квантификаторы

Выше мы уже рассмотрели такие символы, указывающие количество предыдущих символов, как + и * . Приведем все возможности указания количества:

Спецсимволы

Для некоторых групп символов есть специальные сокращения:

"Жадность"

Рассмотрим понятие жадности регулярного выражения. Например есть строка:

#()#

Читаем: подвыражение:

Вроди все верно, подвыражение подходит под:

Но оно также подходит под:

Его то мы и получим, т.к. регулярные выражения по умолчанию "жадные". Снять жадность можно с помощью модификатора "U ", вот так:

#()#U

Модификаторы

После регулярного выражения могут идти модификаторы: "#ТутТелоРегулярногоВыражения#ТутМодификаторы " Виды модификаторов:

i Включает режим case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы "^" и "$" указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s По умолчанию метасимвол ". " не включает в свое определение символ перевода строки. Указание этого модификатора снимает это ограничение.
U Снимает жадность регулярного выражения
u Включает работу регулярных выражений с кириллицей в UTF-8 , иначе работает не корректно.

php Функции для работы с регулярными выражениями

preg_replace

Поиск и замена:

Preg_replace (mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]]);

Каждое значение может быть строкой или массивом, в случае, если $subject массив - возвращается массив, иначе строка

preg_split

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

Preg_split (string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]]);

Возвращает массив, состоящий из подстрок заданной строки subject , которая разбита по границам, соответствующим шаблону pattern .

Чаще всего регулярные выражения используются в Perl в операторах поиска и замены, таких как s// , m/ , операторах связки =~ или != и т.д. Как правило все эти операторы имеют схожие опции такие как:

Обычно все эти опции обозначают как "/x". Их можно использовать даже внутри шаблонов, используя новую конструкцию (?...)

Регулярные выражения или шаблоны (pattern) то же самое, что и regexp процедуры в Unix. Выражения и синтаксис заимствованы из свободно распространяемых процедур V8 Генри Спенсера (Henry Spencer), там же они подробно и описаны.

В шаблонах используются следующие метасимволы (символы обозначающие группы других символов) часто называемые egrep - стандартом:

Метасимволы имеют модификаторы (пишутся после метасимвола):

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом "*" эквивалентна {0,} , "+" - {1,} и "?" - {0,1}. n и m не могут быть больше 65536.

По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов. Если вы хотите "уменьшить их аппетит", то используйте символ "?". Это не изменяет значение метасимволов, просто уменьшает распространение. Таким образом:

Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):

\t - символ табуляции
\n - новая строка
\r - перевод каретки
- перевод формата
\v - вертикальная табуляция
\a - звонок
\e - escape
\033 - восьмеричная запись символа
\x1A - шестнадцатеричная
\c[ - control символ
\l - нижний регистр следующего символа
\u - верхний регистр -//-
\L - все символы в нижнем регистре до \E
\U - в верхнем -//-
\E - ограничитель смены регистра
\Q - отмена действия как метасимвола

Дополнительно в Perl добавлены следующие метасимволы:

Обратите внимание, что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:

Кроме того существуют мнимые метасимволы. Обозначающие не существующие символы в месте смены значения. Такие как:

Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов "\b" обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны "^" и "$", но если начало строки "^" и конец строки "$" действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.

Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как "\цифра". Заметьте, что за шаблоном в пределах выражения или блока эти группы обозначаются как "$цифра". Кроме этого существуют дополнительные переменные:

Пример:

$s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n"; # Результат "1" print "$2\n"; # "2" print "$+\n"; # "2" print "$&\n"; # "1 два 2" print "$`\n"; # "Один " print "$"\n"; # " и три 3" }

Perl версии 5 содержит дополнительные конструкции шаблонов:

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Найти цифру за которой стоит "-" { print "$1\n"; # Результат "2" } else { print "ошибка поиска\n"; }

(?!шаблон)- "заглядывание" вперед по отрицанию:

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Найти цифру за которой не стоит "+" { print "$1\n"; # Результат "2" } else { print "ошибка поиска\n"; }

(?ismx) - "внутренние" модификаторы. Удобно применять в шаблонах, где например нужно внутри шаблона указать модификатор.

Правила регулярного выражения. (regex)

  1. Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним "\".
  2. Строка символов обозначает строку этих символов.
  3. Множество возможных символов (класс) заключается в квадратные скобки "", это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это "^" - значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ "-", обозначающий диапазон символов. Например, a-z - один из малых букв латинского алфавита, 0-9 - цифра и т.д.
  4. форум портала PHP . SU

Регулярные выражения - это специальные шаблоны для поиска подстроки в тексте. С их помощью можно решить одной строчкой такие задачи: «проверить, содержит ли строка цифры», «найти в тексте все адреса email», «заменить несколько идущих подряд знаков вопроса на один».

Начнем с одной народной программистской мудрости:

Некоторые люди, сталкиваясь с проблемой, думают: «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

Примеры шаблонов

Начнем с пары простых примеров. Первое выражение на картинке ниже ищет последовательность из 3 букв, где первая буква это «к», вторая - любая русская буква и третья - это «т» без учета регистра (например, «кот» или «КОТ» подходит под этот шаблон). Второе выражение ищет в тексте время в формате 12:34 .

Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве него обычно используют символ / , но можно использовать и другие символы, не имеющие специального назначения в регулярках, например, ~ , # или @ . Альтернативные разделители используют, если в выражении может встречаться символ / . Затем идет сам шаблон строки, которую мы ищем, за ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они задают дополнительные опции при поиске текста. Вот примеры флагов:

  • i - говорит, что поиск должен вестись без учета регистра букв (по умолчанию регистр учитывается)
  • u - говорит, что выражение и текст, по которому идет поиск, исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск русских (и любых других нелатинских) символов может работать некорректно, потому стоит ставить его всегда.

Сам шаблон состоит из обычных символов и специальных конструкций. Ну например, буква «к» в регулярках обозначает саму себя, а вот символы значат «в этом месте может быть любая цифра от 0 до 5». Вот полный список специальных символов (в мануале php их называют метасимволы), а все остальные символы в регулярке - обычные:

Ниже мы разберем значение каждого из этих символов (а также объясним почему буква «ё» вынесена отдельно в первом выражении), а пока попробуем применить наши регулярки к тексту и посмотреть, что выйдет. В php есть специальная функция preg_match($regexp, $text, $match) , которая принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0 , если нет, или 1 , если она есть. А в переданный массив в элемент с индексом 0 кладется первое найденное совпадение с регуляркой. Напишем простую программу, применяющую регулярные выражения к разным строкам:

Познакомившись с примером, изучим регулярные выражения более подробно.

Скобки в регулярных выражениях

Давай повторим, что обозначают разные виды скобок:

  • Фигурные скобки a{1,5} задают число повторений предыдущего символа - в этом примере выражение ищет от 1 до 5 идущих подряд букв «a»
  • Квадратные скобки означают «один любой из этих символов», в данном случае - буквы a, b, c, x, y, z или цифра от 0 до 5. Внутри квадратных скобок не работают другие спецсимволы вроде | или * - они обозначают обычный символ. Если в квадратных скобках в начале стоит символ ^ то смысл меняется на противоположный: «любой один символ, кроме указанных» - например [^a-c] значит «один любой символ, кроме a, b или c».
  • Круглые скобки группируют символы и выражения. Например в выражении abc+ знак «плюс» относится только к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если поставить скобки a(bc)+ то квантифиактор плюс относится уже к последовательности bc и выражение ищет слова abc, abcbc, abcbcbc

Примечание: в квадратных скобках можно указывать диапазоны символов, но помни, что русская буква ё идет отдельно от алфавита и чтобы написать «любая русская буква», надо писать [а-яё] .

Бекслеши

Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил, что бекслеш везде пишут по-разному. Где-то пишут один бекслеш: \d , а здесь в примерах он повторен 2 раза: \\d . Почему?

Язык регулярных выражений требует писать бекслеш один раз. Однако в строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое значение: мануал про строки . Ну например, если написать $x = "\$"; то PHP воспримет это как специальную комбинацию и вставит в строку только символ $ (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы вставить в строку последовательность \$ , мы должны удвоить бекслеш и записать код в виде $x = "\\$"; .

По этой причине в некоторых случаях (там, где последовательность символов имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:

  • Чтобы написать в регулярке \$ , мы пишем в коде "\\$"
  • Чтобы написать в регулярке \\ , мы удваиваем каждый бекслеш и пишем "\\\\"
  • Чтобы написать в регулярке бекслеш и цифру (\1), бекслеш надо удвоить: "\\1"

В остальных случаях один или два бекслеша дадут один и тот же результат: "\\d" и "\d" вставят в строку пару символов \d - в первом случае 2 бекслеша это последовательность для вставки бекслеша, во втором случае специальной последовательности нет и символы вставятся как есть. Проверить, какие символы вставятся в строку, и что увидит движок регулярных выражений, можно с помощью echo: echo "\$"; . Да, сложно, а что поделать?

Специальные конструкции в регулярках

  • \d ищет одну любую цифру, \D - один любой символ, кроме цифры
  • \w соответствует одной любой букве (любого алфавита), цифре или знаку подчеркивания _ . \W соответствует любому символу, кроме буквы, цифры, знака подчеркивания.

Также, есть удобное условие для указания на границу слова: \b . Эта конструкция обозначает, что с одной стороны от нее должен стоять символ, являющийся буквой/цифрой/знаком подчеркивания (\w), а с другой стороны - не являющийся. Ну, например, мы хотим найти в тексте слово «кот». Если мы напишем регулярку /кот/ui , то она найдет последовательность этих букв в любом месте - например, внутри слова «скотина». Это явно не то, что мы хотели. Если же мы добавим условие границы слова в регулярку: /\bкот\b/ui , то теперь искаться будет только отдельно стоящее слово «кот».

Мануал

  • Синтаксис регулярных выражений в PHP , подробное описание

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


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


Я думаю, вы неоднократно сталкивались с ситуациями, когда у вас есть текст (например, в Microsoft Word) и вам надо найти в нём что-то важное. Если вы знаете, что именно ищете - всё просто: вызвали диалог поиска, ввели искомое слово, нажали кнопку и вуаля - текст найден.


Но что вы будете делать, если вы заранее знаете только тип искомой информации? Например, перед вами стоит задача найти все адреса электронной почты в документе на пару сотен листов. Некоторые будут просматривать документ вручную, некоторые - введут в поиске собаку (@) и будут искать её. Согласитесь - оба вариата это каторжный неблагодарный труд.

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

Регулярное выражение - это текстовая строка, составленная по определённым законам и правилам. Строка состоит из символов и групп символов, метасимволов, квантификаторов и модификаторов.

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

// читаемые символы a Е // нечитаемые символы и коды \x41 - то же что буква "A" \x09 - символ табуляции

Группа символов - это несколько символов, записанные последовательно:

Абвг ACZms

Сразу обращаю ваше внимание - "пробел" в регулярных выражения тоже рассматривается как значимый символ, поэтому при написании выражений будьте внимательны. Например, эти граппы символов являются РАЗНЫМИ выражениями:

АБВГДЕ АБВ ГДЕ

Следующий элемени языка - метасимволы. Приставка "мета" означает, что эти символы описывают некие другие символы или их группы. В таблице рассмотрены основные метасимволы языка регулярных выражений:

Метасимволы для задания специальных символов
() Скобки. Определяют вложенные выражения.
| Метасимвол выбора
^ Метасимвол начала строки
$ Метасимвол конца строки
\n Символ перевода строки (шестнадцатеричный код 0x0A)
\r Символ возврата каретки (шестнадцатеричный код 0x0D)
\t Символ табуляции (шестнадцатеричный код 0x09)
\xhh Вставка символа с шестнадцатиричным кодом 0xhh, например \x42 вставит латинскую букву "B"
Метасимволы для задания групп символов
. Точка. Любой символ.
\d Цифра (0-9)
\D Не цифра (любой символ кроме символов 0-9)
\s Пустой символ (обычно пробел и символ табуляции)
\S Непустой символ (все, кроме символов, определяемых метасимволом \s)
\w "Словарный" символ (символ, который используется в словах. Обычно все буквы, все цифры и знак подчеркивания ("_"))
\W Все, кроме символов, определяемых метасимволом \w

Метасимволы из второй половины таблицы очень легко запомнить. "d" - digit (цифра), "s" - symbol (символ), "w" - word (слово). Если буква большая - значит надо добавить "НЕ" в описанию группы.

Возьмём для примера текст "На красной майке цифры 1812, а на зелёной майке - 2009". Рассмотрим примеры простейших регулярных выражений:

\d\d\d\d - найдёт 1812 и 2009 \D - найдёт все буквы, пробелы и знаки препинания \s - найдёт все пробелы в тексте.

Но ведь год в нашем примере может быть записан не четырьмя, а двумя цифрами, слова могут иметь другие склонения и т.д. Здесь могут помочь подмножества символов, которые задаются при помощи квадратных скобок:

Означает любую цифру (то же, что \d) - означает чётную цифру - обозначает любой символ латниского алфавита (в любом регистре) или цифру.

Например, выражение \d\d\d в тестовой строке найдёт только 1812, но не 2009. Это выражение следует читат как "найти все последовательности из четырёх цифр, где последняя цифра равна 0,2,4,6 или 8".

Нам осталось упомянуть лишь квантификаторы и модификаторы.

Квантификатор - это специальная конструкция, определяющая, сколько раз должен встретиться символ или группа символов. Квантификатор записывается в фигурных скобках "{}". Возможны два формата записи: точный и диапазонный. Точный формат записывается так:

Здесь Х - это количество раз, которое должен повториться предшествующий символ или группа. Например выражение

Вторая форма записи - диапазонная. Записывается как

{X, Y} // или {,Y} // или {X,}

где X - минимальное, а Y - максимальное количество повторений. Например:

читается как "от двух до четырёх последовательно записанных цифр". Если одна из границ не указана, то подразумевается отсутствие ограничения. Например:

\w{3,} - три и более букв. \d{,5} - цифр нет вообще, либо есть, но не более пяти.

Квантификаторы могут применяться как к одному символу, так и к группе:

[ А-Яа-я ]{1,3}

Эта конструкция выберет из текста все русские слова из одной, двух или трёх букв (например, "или", "не", "я", "иду" и т.п.)

Кроме фигурных скобок с уществует ещё три метасимвола-квантификатора: "*" (звёздочка), "+" (плюс) и "?" (вопрос). Их испльзуют в случаях, когда заранее неизвестно минимальное и максимальное количество необходимых повторений. Например, при поиске адресов электронной почты нельзя заранее сказать, сколько символов будет в имени пользователя (до "собаки"), а сколько - в имени домена (после "собаки").

Метасимвол "*" читается как "любое количество от нуля и более", т.е. конструкция

определяет любое количество последовательных букв, в том числе и их полное отсутствие.

Символ "+" отличается от звёздочки лишь тем, что требует наличия хотя-бы одного символа. Т.е. конструкция

соответствует любой цифровой последовательности, где цифр одна или более.

Символ "?" соответствует отсутствию или наличию единственного символа. Т.е. конструкция

соответствует любой цифровой последовательности, где цифр одна или две.

Здесь стоит упомянуть о такой особенности антификаторов "*" и "+" как жадность . Суть в том, что по-умолчанию эти символы соответствуют максимально длинной последовательности символов. Например, для строки "мама мыла раму" выражение:

выберет "мама мыла ра", что несколько неожиданно, ведь мы предполагали получить "ма". Для изменения такого поведения используется метасимвол "?" (знак вопроса), записанный сразу после квантификатора. Он органичивает "аппетит" квантификаторов, заставляя их возвращать первое совпадение, а не самое длинное. Теперь изменим предыдущий пример:

и получим требуемое совпадение "ма".

Последний элемент языка - модификаторы . Модификатор - это спецсимвол, определяющий "системные" параметры анализа регулярных выражений. Таких символов всего четыре, они могут применяться как по отдельности, так и одновременно:

i Включает режим case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы "^" и "$" указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s По умолчанию метасимвол "." не включает в свое определение символ перевода строки. Т.е. для многострочного текста выражение /.+/ вернет только первую строку, а не весь текст, как ожидается. Указание этого модификатора снимает это ограничение.
U Делает все количественные метасимволы "не жадными" по умолчанию. В некоторых модификациях языка (в частности в PHP) вместо "U" используется символ "g", более соответствующий смыслу ("g" - сокращение от английского "greedy", "жадный").

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

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

Для работы с регулярными выражениями в PHP предназначены специальные функции, спосок которых и краткое описание приведены в таблице:

int preg_match (string pattern, string subject [, array matches])

Функция проверяет, совпадает ли содержимое subject с шаблоном pattern. Возвращает 1, если совпадения найдены, иначе возвращает 0. Если указать необязательный параметр-массив matches, то при выполнении функции в него будут занесен единственный элемент - первое найденное совпадение.

"; print_r($found); ?>

int preg_match_all (string pattern, string subject, array matches [, int order])
Функция идентична предыдущей, с единственным отличием - она производит поиск по всему тексту и возвращает в массиве matches ВСЕ найденные совпадения.
mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])
Как и обе предшествующие функции, preg_replace производит поиск фрагмента текста, соответствующего шаблону. Все найденные фрагменты функция заменяет на указанный в параметрах текст. До очистки:\n$text\n\n"; $text = preg_replace("/(\n \s{2,})/"," ",$text); echo "После очистки:\n$text"; // выведет текст, очищенный от спецсимволов // и лишних пробелов?>
mixed preg_replace_callback (mixed pattern, mixed callback, mixed subject [, int limit])
Функция является расширенной версией предыдущей. Главное отличие - этой функции в параметрах передаётся имя функции, которая будет анализировать текст и формировать замещающий текст.
array preg_split (string pattern, string subject [, int limit [, int flags]])
Эта функция аналогична функциям explode() и split(). Её особенность в том, что в качестве разделителя выступает не фиксированная строка, а регулярное выражение. Функция разбивает исходные данные на элементы и помещает их в выходной массив.
array preg_grep (string pattern, array input)
Функция предназначена для регулярного поиска в массивах. Для поиска задаётся шаблон и массив входных данных, а возвращается массив, состоящий только из элементов, соответствющих шаблону.

Рассмотренный список функций далеко не полон, но вполне достаточен для успешного начала работы с регулярными выражениями. Если вы заинтересовались этой темой - обязательно почитайте дополнительную литературу (например, книгу Фридла "Регулярные выражения"). Кроме того, в целях обучения рекомендую поставить одну из специальных программ для тестирования регулярных выражений (например, "PCRE" или "RegEx Builder").

Похожие статьи