Регулярные выражения в PHP. Символ отрицания

Содержание материала:

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

Что такое регулярные выражения?

PHP regexp — это мощный алгоритм сопоставления шаблонов, которое может быть выполнено в одном выражении. Регулярные выражения PHP используют арифметические операторы ( такие как +, -, ^ ) для создания сложных выражений.

Для чего используются регулярные выражения:

  • Регулярные выражения упрощают идентификацию строковых данных путем вызова одной функции. Это экономит время при составлении кода;
  • При проверке введенных пользователем данных, таких как адрес электронной почты, домен сайта, номер телефона, IP-адрес ;
  • Выделение ключевых слов в результатах поиска;
  • Регулярные выражения могут использоваться для идентификации тегов и их замены.

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

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

  • preg_match — используется для выполнения сопоставления с шаблоном строки. Она возвращает true , если совпадение найдено, и false , если совпадение не найдено;
  • preg_split — используется для разбивки строки по шаблону, результат возвращается в виде числового массива;
  • preg_replace – используется для поиска по шаблону и замены на указанную строку.

Ниже приведен синтаксис функций регулярных выражений, таких как preg_match , preg_split или PHP regexp replace :

«имя_функции» — это либо preg_match , либо preg_split , либо preg_replace .
«/…/» — косые черты обозначают начало и конец регулярного выражения.
«‘/шаблон/’» — шаблон, который нам нужно сопоставить.
«объект» — строка, с которой нужно сопоставлять шаблон.

Теперь рассмотрим практические примеры использования упомянутых выше функций.

Preg_match

В первом примере функция preg_match используется для выполнения простого сопоставления шаблоном для слова guru в заданном URL-адресе .

В приведенном ниже коде показан вариант реализации данного примера:

Рассмотрим ту часть кода, которая отвечает за вывод «preg_match (‘/ guru /’, $ my_url)» .

«preg_match(…)» — функция PHP match regexp .
«‘/Guru/’» — шаблон регулярного выражения.
«$My_url» — переменная, содержащая текст, с которым нужно сопоставить шаблон.

Preg_split

Рассмотрим другой пример, в котором используется функция preg_split .

Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:

Preg_replace

Рассмотрим функцию preg_replace , которая выполняет сопоставление с шаблоном и заменяет найденный результат другой строкой.

Приведенный ниже код ищет в строке слово guru . Он заменяет его кодом css , который задает цвет фона:

Метасимволы

В приведенных выше примерах использовались простые шаблоны. Метасимволы позволяют выполнять более сложные сопоставления шаблонов PHP regexp , такие как проверка адреса электронной почты. Рассмотрим часто используемые метасимволы.

Метасимвол Описание Пример
. Обозначает любой единичный символ, кроме символа новой строки. /./ — все, что содержит один символ.
^ Обозначает начало строки, не включая символ /. /^PH/ — любая строка, которая начинается с PH.
$ Обозначает шаблон в конце строки. /com$/ — guru99.com,yahoo.com и т.д.
* Обозначает любое количество символов, ноль или больше. /com*/ — computer, communication и т.д.
+ Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. /yah+oo/ — yahoo.
Символ экранирования. /yahoo+.com/ — воспринимает точку, как дословное значение.
[…] Класс символов. /[abc]/ — abc.
a-z Обозначает строчные буквы. /a-z/ — cool, happy и т.д.
A-Z Обозначает заглавные буквы. /A-Z/ — WHAT, HOW, WHY и т.д.
0-9 Обозначает любые цифры от 0 до 9. /0-4/ — 0,1,2,3,4.

Теперь рассмотрим сложный PHP regexp пример, в котором проверяется валидность адреса электронной почты:

Результат: адрес электронной почты [email protected] является валидным.

Пояснение шаблона «[/^[a-zA-Z0-9._-][email protected][a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «

«‘/…/’» начинает и завершает регулярное выражение.
«^[a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«[email protected][a-zA-Z0-9-]» соответствует символу @ , за которым следуют буквы в нижнем или верхнем регистре, цифры от 0 до 9 или дефисы.
«+.[a-zA-Z.]<2,5>$/» указывает точку, используя обратную косую черту, затем должны следовать любые буквы в нижнем или верхнем регистре, количество символов в конце строки должно быть от 2 до 5.

Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.

Заключение

  • PHP regexp — это алгоритм поиска по шаблону;
  • Регулярные выражения полезны при выполнении проверок валидности, создании HTML-шаблонов , которые распознают теги и т. д.;
  • PHP имеет встроенные функции для работы с регулярными выражениями: preg_match , preg_split и preg_replace ;
  • Метасимволы позволяют создавать сложные шаблоны.

Данная публикация представляет собой перевод статьи « PHP Regular Expressions » , подготовленной дружной командой проекта Интернет-технологии.ру

Регулярные выражения php — символ ^ стрелка вверх — уголок (шапка, колпачок) — Отрицание и привязка к началу

Primary tabs

Forums:

Отрицание символов — «Не»

Если символ используется внутри квадратных скобок, то исключает из соответствия следующую за ним последовательность — и имеет значение «не» , например:

Привязка фрагмента к началу

Если же ^ ставится за пределами выражения в скобках, к примеру:

то это означает привязку последовательности символов к началу строки.

Регулярные выражения в PHP. Символ отрицания

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

то есть, что то вроде «НЕ (искомая строка)»

как сделать отрицание?

Извиняюсь за сумбур.

От: anonymous http://denis.ibaev.name/
Дата: 08.07.04 10:54
Оценка:

Здравствуйте, greek, Вы писали:

G>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте.
G>то есть, что то вроде «НЕ (искомая строка)»
G>как сделать отрицание?

это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl:

От: greek
Дата: 08.07.04 11:07
Оценка:

Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, greek, Вы писали:

G>>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте.
G>>то есть, что то вроде «НЕ (искомая строка)»
G>>как сделать отрицание?

A>это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl:
A>

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

От: ЖуК http://smart-ip.net/
Дата: 08.07.04 11:18
Оценка: -2

Здравствуйте, greek, Вы писали:

G>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.

От: ЖуК http://smart-ip.net/
Дата: 08.07.04 11:35
Оценка:

Здравствуйте, ЖуК, Вы писали:

ЖуК>Здравствуйте, greek, Вы писали:

G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.

ЖуК>

Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

От: anonymous http://denis.ibaev.name/
Дата: 08.07.04 11:43
Оценка: 8 (1)

Здравствуйте, ЖуК, Вы писали:

ЖуК>>

ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

отрицание только в классах символов. твое выражение интерпретируется как «стока не содержит ни одного из символов [()|abforst]».

От: butcher http://bu7cher.blogspot.com
Дата: 08.07.04 11:45
Оценка: 8 (1)
От: butcher http://bu7cher.blogspot.com
Дата: 08.07.04 11:46
Оценка:

Здравствуйте, ЖуК, Вы писали:

G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.

ЖуК>

простой тест: «напечатать строку, если в ней нет слов foo, bar, str»

От: greek
Дата: 08.07.04 11:53
Оценка:

ЖуК>>

ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

по-моему не работает..

От: ЖуК http://smart-ip.net/
Дата: 08.07.04 11:57
Оценка: 2 (1)

Здравствуйте, greek, Вы писали:

ЖуК>>>

ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

G>по-моему не работает..

А по-моему, работает:

З.Ы. Иля я чего-то не понимаю?

От: butcher http://bu7cher.blogspot.com
Дата: 08.07.04 11:57
Оценка:
От: greek
Дата: 08.07.04 12:02
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, greek, Вы писали:

G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.
B>а чем вызвано нежелание пользоваться языковыми конструкциями?

Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации .

От: greek
Дата: 08.07.04 12:09
Оценка:

ЖуК>А по-моему, работает:

ЖуК>Результат здесь

ЖуК>З.Ы. Иля я чего-то не понимаю?

ну наверное я некорректно объяснил.

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

От: anonymous http://denis.ibaev.name/
Дата: 08.07.04 12:24
Оценка:

Здравствуйте, greek, Вы писали:

G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации .

ошибаешься, все наоборот.

От: Аноним
Дата: 08.07.04 12:27
Оценка:

Здравствуйте, greek, Вы писали:
G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации .

простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?

От: ЖуК http://smart-ip.net/
Дата: 08.07.04 12:38
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, ЖуК, Вы писали:

ЖуК>>>

ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
B>вы хотите сказать, что такой регэксп значит — «истина, если в строке нет таких слов»?

Бучер, извини, гоню

От: greek
Дата: 08.07.04 14:07
Оценка:

Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, greek, Вы писали:

G>>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации .

A>ошибаешься, все наоборот.
из чего сделан подобный вывод не ясно

Вопрос остается в силе.

правильное решение так и не было высказано

От: greek
Дата: 08.07.04 14:10
Оценка:

А>простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?

Лазит по ссылкам на сайте и индексирует контент.
По этим данным потом осуществляется поиск по сайту и выдача ссылочек, на страницах которых была найдена искомая фраза.

Тот который я сейчас настраиваю — Yader, написанный на asp

От: butcher http://bu7cher.blogspot.com
Дата: 08.07.04 14:26
Оценка: 7 (2) +1
От: greek
Дата: 08.07.04 14:29
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, greek, Вы писали:

G>>Вопрос остается в силе.
G>>правильное решение так и не было высказано
B>ИМХО, назначение регулярных выражений — поиск совпадения, а не наоборот
B>Когда-то давно я тоже озадачивал себя такой проблемой, но решения так и не нашёл..
B>Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.

PHP: исключить определенный символ с регулярным выражением [duplicate]

Мне нужно регулярное выражение, которое может соответствовать всем, кроме строки, начинающейся с определенного шаблона (в частности index.php и следующего, как index.php? >)

7 ответов

Не эксперт по регулярному выражению, но я думаю, что с самого начала вы могли бы использовать негативный взгляд. ^(?!foo).*$ не должен соответствовать чему-либо, начиная с foo .

Пожалуйста, добавьте больше на другие языки — я отметил это как Community Wiki.

Вы можете поместить ^ в начале набора символов в соответствие с любым, кроме этих символов.

будет соответствовать всем, кроме =

Как не использовать регулярное выражение:

Просто сопоставьте /^index\.php/ , затем отклоните все, что соответствует ему.

Regex: соответствие всем, кроме:

  • строка , начиная с определенного шаблона (например, any — empty, too — string, не начиная с foo ): Решение, основанное на Lookahead для NFA: ^(?!foo).*$^(?!foo) Решение с отклоненным символьным классом для двигателей с регулярным выражением, не поддерживающее обратные просмотры : ^(([^f].<2>|.[^o].|.<2>[^o]).*|.<0,2>)$^([^f].<2>|.[^o].|.<2>[^o])|^.<0,2>$
  • строка , заканчивающаяся на определенным шаблоном (скажем, нет world. в конце): Lookbehind на основе: (?^.*(? Обходной путь POSIX: ^(.*([^w].<5>|.[^o].<4>|.<2>[^r].<3>|.<3>[^l].<2>|.<4>[^d].|.<5>[^.])|.<0,5>)$([^w].<5>|.[^o].<4>|.<2>[^r].<3>|.<3>[^l].<2>|.<4>[^d].|.<5>[^.]$|^.<0,5>)$
  • строка , содержащая специальный текст (скажем, не соответствует строке, имеющей foo ) (нет POSIX-совместимого patern, извините): ^(. *foo)^(. *foo).*$
  • строка , содержащая специфический символ (например, избегайте совпадения строки с символом | ): ^[^|]*$
  • строка равна некоторой строке (скажем, не равной foo ): Lookaround: ^(?!foo$)^(?!foo$).*$ POSIX: ^(.<0,2>|.<4,>|[^f]..|.[^o].|..[^o])$
  • последовательность символов: PCRE (соответствует любому тексту, но cat ): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i или /cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is Другие двигатели, позволяющие искать: (cat)|[^c]*(?:c(?!at)[^c]*)* (или (?s)(cat)|(?:(?!cat).)* или (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]* ), а затем проверить с помощью языка: если группа 1 соответствует, это не что нам нужно, еще, возьмите значение соответствия, если не пусто
  • , определенный одиночный символ или набор символов: используйте класс с отрицанием символов : [^a-z]+ (любой символ, отличный от строчной буквы ASCII). Соответствие любому символу, но | : [^|]+

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

Якорная заметка: на многих языках используйте \A для определения однозначного начала строки и \z (в Python это \Z , в JavaScript, $ в порядке), чтобы определить самый конец строки.

Примечание: во многих вариантах (но не POSIX, TRE, TCL), . соответствует любому char , но символ новой строки . Убедитесь, что вы используете соответствующий модификатор DOTALL ( /s в PCRE / Boost / .NET / Python / Java и /m в Ruby) для . для соответствия любому символу, содержащему новую строку.

Замечание обратной косой черты: на языках, где вы должны объявлять шаблоны со строками C, позволяющими escape-последовательности (например, \n для новой строки), вам нужно удвоить обратную косую черту, ускользающую от специальных символов, чтобы движок мог рассматривать их как буквенные символы (например, в Java , world\. будет объявлен как «world\\.» или использовать класс символов: «world[.]» ). Используйте исходные строковые литералы (Python r’\bworld\b’ ), строковые литералы строки C # @»world\.» или строковые строковые / регулярные обозначения типа /world\./ .

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Регулярные выражения в PHP (ч. 2)

Оглавление

Первая часть:

Вторая часть:

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

Общие типы символов

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

Например, далее рассмотрены способы указания общего типа символов — некоторые из этих способов записи являются альтернативным синтаксисом к уже рассмотренным. Допустим если мы хотим указать в регулярном выражении «любая цифра», то мы можем использовать [0-9]. Также имеется ещё один вариант записи с помощью экранирующих последовательностей. «Любая десятичная цифра» в них обозначается как \d.

Экранирующие последовательности — это набор символов, которые начинаются с обратного слэша \ и, следовательно, которые теряют своё буквальное значение, а начинают иметь специальное значение. Получается, что для специальных символов обратный слэш отключает их специальное значение, а для обычных букв и цифр он включает специальное значение (если оно предусмотрено).

Среди экранирующих последовательностей есть элементы синтаксиса, который невозможно передать иным способом. Примеры будут показаны далее.

Общие типы символов обозначаются так:

\d

любая десятичная цифра

\D

любой символ, кроме десятичной цифры

\h

любой горизонтальный пробельный символ

\H

любой символ, не являющийся горизонтальным пробельным символом

\s

любой пробельный символ

\S

любой непробельный символ

\v

любой вертикальный пробельный символ

\V

любой символ, не являющийся вертикальным пробельным символом

\w

Любой символ, образующий «слово»

\W

Любой символ, не образующий «слово»

Каждая пара таких специальных последовательностей делит полное множество всех символов на два непересекающихся множества. Любой символ соответствует одному и только одному множеству из пары.

Следующие символы считаются как «пробельные»: HT (9), LF (10), FF (12), CR (13), и пробел (32). Тем не менее, если идет локале-зависимый поиск, и произойдет совпадение с символами в диапазоне 128-255, они также будут восприняты как пробельные, например NBSP (A0).

Символ, образующий «слово» — это произвольная цифра, буква или символ подчеркивания, проще говоря, любой символ, который может являться частью «слова» в Perl. Определение букв и цифр управляется символьными таблицами, с которыми была собрана PCRE. И, как следствие, эти наборы могут отличаться в различных локализированных дистрибутивах. Например, в локали «fr» (Франция) некоторые символы с кодом выше 128 используются для записи ударных символов и, соответственно, соответствуют маске \w.

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

У этих символов может быть весьма полезное применение. Давайте вспомним (чуть переделанное) регулярное выражение для вывода HTML тэга всех заголовков вместе с конечным тегом, а также вместе с самим содержанием заголовка:

Используя уже известный код:

я получил вот такой результат:

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

А если запись разбита на несколько строк, например так:

то такие заголовки найдены не были.

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

Проблема в нашем регулярном выражении, которое мы написали — мы не указали, что после открывающего тэга заголовка могут идти пробелы. Затем после содержимого заголовка также могут идти пробелы. Давайте составим новое регулярное выражение, с учётом этого. Любые пробельные символы обозначаются как \s. Их может не быть вовсе, а может быть несколько, поэтому в качестве квантора нужно использовать звёздочку, получаем \s*. Эту конструкцию вставляем два раза: 1) между открывающим HTML тэгом и содержимым заголовка; 2) между концом содержимого заголовка и закрывающим HTML тэгом.

Получаем такое регулярное выражение:

В результате находим 51 заголовок — видимо, это все заголовки анализируемой страницы, среди них как написанный в одну строку, так и многострочные.

В подобных случаях также можно использовать модификатор регулярного выражения s. Подробности и примеры смотрие в статье «Поиск по нескольким строкам в PHP с функциями preg_match_all и preg_match».

Следующие два раздела (непечатные символы и определение формальных утверждений) — нечасто применимы, поэтому если вы в них не разобрались, то просто переходите к последующим параграфам.

Непечатные символы в видимой форме в описании шаблона

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

\a

символ оповещения, сигнал, (BEL, шестнадцатеричный код 07)

\cx

«Ctrl+x«, где x — произвольный символ

\e

escape (шестнадцатеричный код 1B)

\f

разрыв страницы (шестнадцатеричный код 0C)

\n

перевод строки (шестнадцатеричный код 0A)

символ со свойством xx, подробнее смотрите свойства unicode

символ без свойства xx, подробнее смотрите свойства unicode

\r

возврат каретки (шестнадцатеричный код 0D)

\R

разрыв строки: совпадает с \n, \r и \r\n

\t

табуляция (шестнадцатеричный код 09)

\xhh

символ с шестнадцатеричным кодом hh

\ddd

символ с восьмеричным кодом ddd, либо ссылка на подмаску

Если быть более точным, комбинация «\cx» интерпретируется следующим образом: если «x» — символ нижнего регистра, он преобразуется в верхний регистр. После этого шестой бит символа (шестнадцатеричный код 40) инвертируется. Таким образом «\cz» интерпретируется как шестнадцатеричное значение 1A, в то время как «\c<" получает шестнадцатеричное значение 3B, а "\c;" - 7B.

После «\x» считываются еще две шестнадцатеричные цифры (они могут быть записаны в нижнем или верхнем регистре). В режиме UTF-8, разрешается использование «\x<. >«, где содержимое скобок является строкой из шестнадцатеричных цифр. Она интерпретируется как символ UTF-8 character с кодом, совпадающим с данным шестнадцатеричным числом. Исходная шестнадцатеричная экранирующая последовательность, \xhh, совпадает с двухбайтным UTF-8 символом, если его значение превышает 127.

После «\0» считываются две восьмеричные цифры. Если в записи менее двух цифр, будут использованы все фактически присутствующие цифры. Таким образом, последовательность «\0\x\07» будет интерпретирована как два бинарных нуля, за которыми следует символ оповещения (звонок). В случае, если вы используете представление числа в восьмеричном коде, убедитесь, что за начальным нулем следуют две значащие цифры.

Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее. Вне символьного класса PCRE воспринимает обратный слеш и следующие за ним цифры как десятичное число. Если полученное значение меньше десяти, либо если шаблон содержит по меньшей мере такое же количество предшествующих текущей позиции подмасок, вся конструкция интерпретируется как ссылка на подмаску. Более детальное описание будет приведено ниже при обсуждении механизма работы подмасок.

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

\040

еще один способ записи пробела

\40

то же самое в случае, если данной записи предшествует менее сорока подмасок

\7

всегда интерпретируется как ссылка на подмаску

\11

может быть как обратной ссылкой, так и альтернативной записью символа табуляции

\011

всегда интерпретируется как символ табуляции

\0113

символ табуляции, за которым следует цифра «3»

\113

интерпретируется как символ с восьмеричным кодом 113 (так как ссылок на подмаски не может быть более чем 99)

\377

байт, всецело состоящий из единичных битов

\81

либо обратная ссылка, либо бинарный ноль, за которым следуют цифры «8» и «1»

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

Все последовательности, определяющие однобайтное значение, могут встречаться как внутри, так и вне символьных классов. Кроме того, внутри символьного класса запись «\b» интерпретируется как символ возврата (‘backspace’, шестнадцатеричный код 08). Вне символьного класса она имеет другое значение (какое именно, описано ниже).

Определение формальных утверждений

Ещё одно использование обратного слеша — определение некоторых формальных утверждений, описывающих условия касательно месторасположения особых позиций в строке и совершенно не затрагивающих сами символы. Использование подмасок как более сложных формальных утверждений описано далее. Такими управляющими последовательностями являются:

\b

\B

не является границей слова

\A

начало данных (независимо от многострочного режима)

\Z

конец данных либо позиция перед последним переводом строки (независимо от многострочного режима)

\z

конец данных (независимо от многострочного режима)

\G

первая совпадающая позиция в строке

Описанные выше последовательности не могут встречаться в символьных классах (исключая комбинацию «\b«, которая внутри класса означает символ возврата ‘backspace’).

Границей слова считается такая позиция в строке, в которой из текущего и предыдущего символа только один соответствует \w или \W (т.е. один из них соответствует \w, а другой \W). Начало или конец строки также соответствуют границе слова в случае, если первый или, соответственно, последний символ совпадает с \w.

Специальные последовательности \A, \Z и \z отличаются от общеупотребляемых метасимволов начала строки ‘^‘ и конца строки ‘$‘ (описанных в разделе якоря первой части) тем, что они всегда совпадают либо в самом начале либо в самом конце строки. На них никак не влияют опции m (PCRE_MULTILINE) и D (PCRE_DOLLAR_ENDONLY). Разница между \Z и \z в том, что \Z соответствует позиции перед последним символом в случае, если последний символ — перевод строки, кроме самого конца строки. В то время, как \z соответствует исключительно концу данных.

Утверждение \G является истинным только в том случае, если текущая проверяемая позиция находится в начале совпадения, указанного параметром offset функции preg_match(). Она отличается от \A при ненулевом значении параметра offset.

\Q и \E могут быть использованы для игнорирования метасимволов регулярных выражений в шаблоне. Например: \w+\Q.$.\E$ совпадет с один или более символов, составляющих «слово»,за которыми следуют символы .$. и якорь в конце строки.

Последовательность \K может быть использована для сброса начала совпадения. Например, шаблон foo\Kbar совпадет с «foobar», но сообщит о том, что совпал только с «bar». Использование \K не мешает установке подмасок. Например, если шаблон (foo)\Kbar совпадет со строкой «foobar», первой подмаской все равно будет являться «foo».

POSIX нотация для символьных классов

Perl поддерживает нотацию POSIX для символьных классов. Это включает использование имен, заключенных в [: и :], в свою очередь заключенных в квадратные скобки. PCRE также поддерживает эту запись. Например, [01[:alpha:]%] совпадет с «0», «1», любым алфавитным символом или «%«. Поддерживаются следующие имена классов:

alnum буквы и цифры
alpha буквы
ascii символы с кодами 0 — 127
blank только пробел или символ табуляции
cntrl управляющие символы
digit десятичные цифры (то же самое, что и \d)
graph печатные символы, исключая пробел
lower строчные буквы
print печатные символы, включая пробел
punct печатные символы, исключая буквы и цифры
space пробельные символы(почти то же самое, что и \s)
upper прописные буквы
word символы «слова» (то же самое, что и \w)
xdigit шестнадцатеричные цифры

Класс пробельных символов (space) — это горизонтальная табуляция (HT, 9), перевод строки (LF, 10), вертикальная табуляция (VT, 11), разрыв страницы (FF, 12), возврат каретки (CR, 13) и пробел (32). Учтите, что этот список включает вертикальную табуляцию (VT, код 11). Это отличает «space» от \s, который не включает этот символ (для совместимости с Perl).

Название word — это расширение Perl, а blank — расширение GNU, начиная с версии Perl 5.8. Другое расширение Perl — это отрицание, которое указывается символом ^ после двоеточия. Например, [12[:^digit:]] совпадет с «1», «2», или с любой не-цифрой.

В режиме UTF-8, символы со значениями, превышающими 128, не совпадут ни с одним из символьных классов POSIX. Начиная с PHP 5.3.0 и libpcre 8.10 некоторые символьные классы изменены, чтобы использовать свойства символов Unicode, в этом случае упомянутое ограничение не применяется. Читайте руководство PCRE(3) для подробностей.

Подмаски

Подмаска — это часть регулярного выражения, которая участвует в поиске. Подмаска может выполнять несколько функций:

1) если была найдена строка, соответствующая целому регулярному выражению, то в результаты поиска будут возвращены две строки: во-первых, соответствующая всему регулярному выражению, и, во-вторых, соответствующая подмаске

2) найденная в подмаске строка может вновь использоваться в регулярном выражении в качестве обратной ссылке (о них позже)

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

Подмаски могут быть вложенными одна в другую.

При использовании функции preg_match_all возвращается массива, где в качестве первого элемента (с индексом 0) возвращается массив с найденными значениями строк. Если указаны подмаски, то в качестве второго элемента возвращаемого массива (с индексом 1) будет массив с найденными строками, соответствующими первой подмаске. Если используется две подмаски, то будет возвращён ещё один массив и так далее для каждой последующей подмаске.

Как мы помним из первой части, описывающий синтаксис регулярных выражений, скобки имеют и другое значение: или использовании оператора | (ИЛИ) они ограничивают варианты альтернатив друг от друга. Например, шаблон cat(aract|erpillar|) соответствует одному из слов «cat», «cataract» или «caterpillar». Без использования скобок он соответствовал бы строкам «cataract», «erpillar» или пустой строке.

То есть скобки выполняют одновременно две функции.

На самом деле выполнение одновременно двух функций не всегда удобно. Бывают случаи, когда необходима группировка альтернатив без захвата строки. В случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно. Максимальное количество захватывающих подмасок — 65535. Такие большие шаблоны могут не скомпилироваться, в зависимости от настроек libpcre.

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

соответствуют одному и тому же набору строк. Поскольку альтернативные версии берутся слева направо, и установленные опции сохраняют своё действие до конца подмаски, опция, установленная в одной ветке, также имеет эффект во всех последующих ветках. Поэтому приведенные выше шаблоны совпадают как с «SUNDAY», так и с «Saturday».

Также можно использовать именованные подмаски с помощью синтаксиса (?P pattern). Эта подмаска будет индексирована в массиве совпадений кроме обычного числового индекса, еще и по имени name. В PHP 5.2.2 было добавлено два альтернативных синтаксиса: (? pattern) и (?’name’pattern).

Иногда бывает необходимо иметь несколько совпадений, исключающих друг друга. Обычно, каждое такое совпадение получает свой собственный номер, даже если шаблон позволяет совпасть только одному из них. Синтаксис (?| позволяет обойти это поведение и убрать дублирующиеся номера. Рассмотрим следующее регулярное выражение, сопоставленное со строкой Sunday:

Здесь Sun сохраняется в ссылке 2, тогда как ссылка 1 пуста. Если же совпадет Sat, то она будет помещена в ссылку 1, а ссылка 2 вообще не будет существовать. Использование (?| в шаблоне решает эту проблему:

В этом шаблоне обе подмаски Sun и Sat будут сохранены под номером 1.

Обратные ссылки в PHP

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

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

Однако, в случае, если следующее за обратным слешем число меньше 10, оно всегда интерпретируется как обратная ссылка, и приводит к ошибке только в том случае, если нет соответствующего числа открывающих скобок. Другими словами, открывающие скобки не обязаны предшествовать ссылке для чисел меньше 10. «Упреждающая обратная ссылка» может иметь смысл, если используется повторение и более поздняя подмаска участвует в ранней итерации. Более детальную информацию об обработке цифр после обратного слеша можно найти в разделе «Обратный слеш».

Обратная ссылка сопоставляется с частью строки, захваченной соответствующей подмаской, но не с самой подмаской. Таким образом шаблон (sens|respons)e and \1ibility соответствует «sense and sensibility», «response and responsibility», но не «sense and responsibility». В случае, если обратная ссылка обнаружена во время регистрозависимого поиска, то при сопоставлении обратной ссылки регистр также учитывается. Например, ((?i)rah)\s+\1 соответствует «rah rah» и «RAH RAH», но не «RAH rah», хотя сама подмаска сопоставляется без учета регистра.

На одну и ту же подмаску может быть несколько ссылок. Если подмаска не участвовала в сопоставлении, то сопоставление со ссылкой на нее всегда терпит неудачу. Например, шаблон (a|(bc))\2 терпит неудачу, если находит соответствие с «a» раньше, чем с «bc». Поскольку может быть до 99 обратных ссылок, все цифры, следующие за обратным слешем, рассматриваются как часть потенциальной обратной ссылки. Если за ссылкой должна следовать цифра, необходимо использовать ограничитель. В случае, если указан флаг x (PCRE_EXTENDED), ограничителем может быть любой пробельный символ. В противном случае можно использовать пустой комментарий.

Ссылка на подмаску, внутри которой она расположена, всегда терпит неудачу, если это первое сопоставление текущей подмаски. Например, шаблон (a\1) не соответствует ни одной строке. Но все же такие ссылки бывают полезны в повторяющихся подмасках. Например, шаблон (a|b\1)+ совпадает с любым количеством «a», «aba», «ababaa». При каждой итерации подмаски обратная ссылка соответствует той части строки, которая была захвачена при предыдущей итерации. Чтобы такая конструкция работала, шаблон должен быть построен так, чтобы при первой итерации сопоставление с обратной ссылкой не производилось. Этого можно достичь, используя альтернативы (как в предыдущем примере), либо квантификаторы с минимумом, равным нулю.

Начиная с PHP 5.2.2, управляющая последовательность \g может быть использована для абсолютных и относительных ссылок на подмаски. После этой последовательности должно быть указано беззнаковое или отрицательное число, при желании заключенное в фигурные скобки. Последовательности \1, \g1 и \g эквивалентны друг другу. Использование этого шаблона с беззнаковым числом поможет избежать двусмысленности, присущей числам после обратного слеша. Это также помогает отличить обратные ссылки от символов в восьмеричном формате, а также упрощает запись числового литерала сразу после обратной ссылки, например, \g<2>1.

Использование отрицательных чисел с \g полезно при использовании относительных ссылок. Например, (foo)(bar)\g соответствует «foobarbar», а (foo)(bar)\g соответствует «foobarfoo». Это также может быть полезно в длинных шаблонах, в качестве альтернативы отслеживания числа подмасок, на которые можно ссылаться в последующей части шаблона.

Указать обратную ссылку на именованную подмаску можно с помощью (?P=name) или, начиная с PHP 5.2.2, \k или \k’name‘. Кроме того, в PHP 5.2.4 была добавлена поддержка \k> и \g>, а в PHP 5.2.7 для \g и \g’name’.

К примеру, я хочу найти строки, состоящие из пяти любых, но одинаковых цифр, например, «11111», «22222» и так далее, в этом случае я могу написать следующее регулярное выражение:

Как мы рассмотрели чуть выше, экранирующая последовательность \d обозначает любую цифру. Для того, чтобы найденную строку можно было использовать в качестве обратной ссылке, мы заключаем эту часть регулярного выражения в круглые скобки. То есть получается, что мы создаём подмаску в регулярном выражении. Затем идёт обратный слэш \ с цифрой 1 — это и есть обратная ссылка. То есть, что бы ни было найдено в первой подмаске, его значение будет помещено в обратную ссылку \1. Затем ещё идут три таких же обратных ссылки. Получается что регулярное выражение ищет любую цифру, за которой ещё четыре раза идёт эта же самая цифра.

Для поиска возьмём строку:

даст следующий результат:

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

Рассмотрим более практический пример. Допустим мы хотим найти в HTML коде все пары тэгов: открывающий и закрывающий тэг, между которыми идёт какой-либо текст. Есть исключения (например,
, и так далее) — но не будем их рассматривать, чтобы не усложнять пример.

Тэг абзаца выглядит примерно так:

Тэг раздела страницы:

Как мы видим, в угловые скобки помещено название тэга, которое представляет собой одну или более маленьких букв. Закрывающим тэгом является эта же самая конструкция, с этим же самым названием тэга, но перед названием добавляется слэш /.

Любая буква в угловых скобках обозначается так:

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

Закрывающим тэгом будет обратная ссылка, содержащая найденное название тэга, помещённая между , то есть:

Поскольку в качестве разделителя используется слэш, то тот слэш, который означает «буквальный слэш» нужно экранировать, чтобы он потерял своё специальное значение и стал трактоваться как буквальный символ, получаем:

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

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

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

Функции PHP для поиска и замены по регулярному выражению

Рассмотренные ранее функции ищут строки по регулярному выражению (preg_match_all), либо проверяют, строку на соответствие регулярному выражению (preg_match). В случае, если нужно не просто найти строку, но и заменить её, используются следующие функции:

  • preg_filter — Производит поиск и замену по регулярному выражению
  • preg_replace_callback_array — Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_replace — Выполняет поиск и замену по регулярному выражению

В результате работы функции preg_replace, если найдены совпадения, возвращается новая версия subject, иначе subject возвращается нетронутым. Функция preg_filter() идентична функции preg_replace() за исключением того, что возвращает только те значения (возможно, преобразованные), в которых найдено совпадение. Подробнее о работе функций читайте по приведённым выше ссылкам.

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

Пример использование функции preg_replace_callback:

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

Пример моего реального недавнего использования функции preg_replace_callback на практике — добавления рекламы в каждый десятый комментарий — с её помощью очень легко реализовать подобную логику.

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

  • preg_last_error — Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • preg_quote — Экранирует символы в регулярных выражениях
  • preg_split — Разбивает строку по регулярному выражению

Когда не нужно использовать регулярные выражения

Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() поскольку она выполнит эту задачу гораздо быстрее.

Если вам не нужна мощь регулярных выражений, то вместо preg_split вы можете выбрать более быстрые (хоть и простые) альтернативы наподобие explode() или str_split().

Шпаргалка по регулярным выражениям. В примерах

Регулярные выражения (regex или regexp) очень эффективны для извлечения информации из текста. Для этого нужно произвести поиск одного или нескольких совпадений по определённому шаблону (т. е. определённой последовательности символов ASCII или unicode).

Области применения regex разнообразны, от валидации до парсинга/замены строк, передачи данных в другие форматы и Web Scraping’а.

Одна из любопытных особенностей регулярных выражений в их универсальности, стоит вам выучить синтаксис, и вы сможете применять их в любом (почти) языке программирования (JavaScript, Java, VB, C #, C / C++, Python, Perl, Ruby, Delphi, R, Tcl, и многих других). Небольшие отличия касаются только наиболее продвинутых функций и версий синтаксиса, поддерживаемых движком.

Давайте начнём с нескольких примеров.

Основы

Якоря — ^ и $

Квантификаторы — * + ? и <>

Оператор ИЛИ — | или []

Символьные классы — \d \w \s и .

Используйте оператор . с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.

У операторов \d , \w и \s также есть отрицания ― \D, \W и \S соответственно.

Например, оператор \D будет искать соответствия противоположенные \d .

Непечатаемые символы также можно искать, например табуляцию \t , новую строку \n , возврат каретки \r .

Флаги

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

Регулярное выражение, как правило, записывается в такой форме / abc /, где шаблон для сопоставления выделен двумя слешами / . В конце выражения, мы определяем значение флага (эти значения можно комбинировать):

  • g (global) ― не возвращает результат после первого совпадения, а продолжает поиск с конца предыдущего совпадения.
  • m (multi line) ― с таким флагом, операторы ^ и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
  • i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).

Средний уровень

Скобочные группы ― ()

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

Если присвоить группам имена (используя ( ? . ) ), то можно получить их значения, используя результат сопоставления, как словарь, где ключами будут имена каждой группы.

Скобочные выражения ― []

Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту \ ) теряют своё служебное значение, поэтому нам ненужно их экранировать.

Жадные и ленивые сопоставления

Квантификаторы ( * + <> ) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.

Например, выражение соответствует

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

Продвинутый уровень

Границы слов ― \b и \B

\b ― соответствует границе слова, наподобие якоря (он похож на $ и ^ ), где предыдущий символ ― словесный (например, \w ), а следующий ― нет, либо наоборот, (например, это может быть начало строки или пробел).

\B ― соответствует несловообразующей границе. Соответствие не должно обнаруживаться на границе \b .

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

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

Существует несколько разных диалектов регулярных выражений, среди которых один из самых распространенных и развитых является синтаксис Perl-совместимых регулярных выражений (PCRE — Perl Compatible Regular Expressions).

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

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

Допустимо использовать инструкции модификаторы шаблона, которые действующие на все регулярное выражение. Например, модификатор «i» будет осуществлять поиск по регулярному выражению без учета регистра. Для русских символов в кодировке UTF8, для правильной обработки необходимо добавлять модификатор «u» (PCRE_UTF8). Например:
Регулярное выражение из примера будет соответствовать как строке «компьютер«, так и «КОМПЬЮТЕР«.

Для привязки регулярного выражения к началу слова используется символ «^» (caret — знак вставки):
Данное выражение будет соответствовать строке «светильник«, и не будет соответствовать слову «рассвет«.

Знак доллара «$» означает конец строки:
Данное регулярное выражение соответствует исключительно строке «светильник«, где после искомого слова нет другого текста.

Следующее регулярное выражение соответствует пустой строке:
Очень часто в поисковой строке содержится символ начала и конца регулярного выражение, в нашем случае символ косой черты «/«. В этом случае необходимо экранировать данный символ с помощью символа обратного слеша (\):
В данном примере регулярное выражение будет соответствовать строке светильник/потолочный«.

В качестве разделителя может выступать любой другой символ, например «|«:
Изменять разделители необходимо выходя из задачи поиска, например, если символ косой черты «/» встречается часто в поисковой строке, то его можно изменить.

Следует быть очень внимательными используя некоторые символы для разделителей, поскольку они могут выполнять свою роль в шаблоне. Использование символа вертикальной черты «|» в регулярном выражении может быть использовано для задания альтернативных масок:
Данному регулярному выражению соответствует любая строка, содержащая подстроки «abc» или «def«. Вертикальную черту в большинстве случаев применяют при проверке, например, расширений файлов или зон доменных имен.

Подстроки в регулярных выражениях можно группировать при помощи скобок «()«:
Это регулярное выражение будет соответствовать строке вида «цвет красный«, но вместо «красный» может быть как «синий«, так и «зеленый«.

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

Чтобы задать класс символов необходимо использовать квадратные скобки «[]«. Они ограничивают поиск теми символами, которые в них заключены:
Данному регулярному выражению будет соответствовать подстрока, которая содержит хотя бы один символ из «abc«.

Для создания регулярного выражения, которое соответствует всем буквам английского алфавита, можно перечислить все буквы в регулярном выражении, а можно записать более коротко следующим образом:
Любые два символа, разделяемые дефисом, задают соответствие диапазону символов, находящихся между ними. В данном регулярном выражении описаны символы нижнего регистра, но модификатор «i» осуществляет регистрозависимый поиск.

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

\d — любая десятичная цифра ([0-9]);

\D — любой символ, кроме десятичной цифры;

\s — любой пробельный символ ([ \r\n\t\f]);

\S — любой непробельный символ;

\w — любой символ, образующий «слово» ([a-zA-Z0-9_]);

\W — любой символ, не образующий «слово»;

\t — символ табуляции;

\n — символ перевода строки;

\\ — символ обратного слеша (\);

\. — символ точки (.).

Символ точки «.» обозначает любой символ в регулярном выражении кроме символов разрыва строки «\r» или «\n«, поэтому для поиска точки следует экранировать этот символ.

Регулярное выражение для числа можно записать следующим образом:
Чтобы исключить класс символов из поиска необходимо в квадратных скобках поставить первым символ «^«, который действует уже не как указатель границы строки, а как отрицание:
Данное регулярное выражение отвечает любому символу, не содержащемуся в диапазоне «0-9«.

Список специальных символов (метасимволы):
Выражение в квадратных скобках часто применяется совместно с так называемыми квантификаторами, которые являют собой символы «?«, «+» и «*«. Квантификаторы следуют сразу за символом и изменяют число вхождений конкретного символа в строку:

? — символ либо входит в строку один раз, либо вообще в нее не входит;

* — любое число вхождений символа в строку, в том числе и 0;

+ — одно или более число вхождений символа в строку.

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

«ab » — соответствует строке «abb«;

«ab » — соответствует строке, в которой за «b» следует не менее двух «b«;

«ab » — соответствует строке, в которой за «b» следует от 2 до 4 символов «b«.

Выражение » » полностью аналогично «*«, а » » — «+«. Выражение » » можно записать более коротко, используя «?«.

Для объединения символов в последовательность, их необходимо поместить в круглые скобки. Например, следующее регулярное выражение соответствует строке, в которой за «a» следует от 2 до 4 последовательностей «bc«;
Существует модификатор U, который инвертирует жадность. Например, выражение соответствует строке, содержащей несколько тегов HTML-разметки, целиком. Чтобы выделить отдельные теги, можно применить жадность: или /U.

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

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

После прочтения теоретических основ пора переходить к практическим. Для работы с регулярными выражениями существуют несколько функций. Более детально о каждой из них вы можете почитать на странице: Функции для работы с регулярными выражениями.

Первой рассмотрим функцию Preg_match, которая осуществляет поиск в строке по регулярному выражению и имеет следующий синтаксис:
Функция Preg_match ищет в заданном тексте Subject совпадения с шаблоном Pattern. Если задан необязательный параметр Matches, то результаты поиска помещаются в массив. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[i] — часть строки, соответствующей первым круглым скобкам, $matches[2] — вторым и т. д.

Необязательный параметр Flags может принимать единственное значение PREG_OFFSET_CAPTURE, при указании которого изменяется формат возвращаемого массива $matches — каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение. Поиск осуществляется слева направо, с начала строки.

Функция Preg_match возвращает количество найденных соответствий, которое может принимать только 2 значение — (совпадения не найдены) и 1, поскольку данная функция прекращает свою работу после первого найденного совпадения.

Для поиска всех совпадений, следует воспользоваться функцией Preg_match_all, которая имеет следующий синтаксис:
Функция Preg_match_all ищет в строке Subject все совпадения с шаблоном Pattern и помещает результат в массив Matches в порядке, определяемом комбинацией флагов Flags. Так же как и в предыдущей функцией можно задать смещение Offset, начиная с которого будет осуществляться поиск встроке Subject. После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Перейдем к функции, которая кроме поиска осуществляет и замену по регулярному выражению — Preg_replace:
Функция Preg_replace выполняет поиск совпадений в строке Subject с шаблоном Pattern и заменяет их на Replacement.

Функция Preg_split разбивает строку по регулярному выражению.
Функция возвращает массив, состоящий из подстрок заданной строки Subject, которая разбита по границам, соответствующим шаблону Pattern.

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

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

(?#комментарий) — комментарий в теле шаблона. Иногда очень полезно разместить в теле регулярного выражения конкретный комментарий для лучшего понимания работы.

(?:шаблон) — группировка как и «( )«, но без обратной ссылки. Данная группировка очень полезна для задания шаблона но без создания обратной ссылки.

(?=шаблон) — «заглядывание» вперед. Данная конструкция может понадобится для поиска по шаблону с наперед указанным выражением, например, выражение «/\w+(?=\t)/» соответствует слову, за которым идет символ табуляции, но символ «\t» не включается в результат.

А теперь опишем наиболее часто употребляемые примеры использования регулярных выражений:

Проверка правильности ввода E-mail:
До символа собачки шаблон ищет буквы и цыфры, знак тире, нижнего подчеркивания и
крапки одно или более число вхождений начиная от начала строки:
Далее следует вторая часть почтового адреса, начиная с собачки имея тот же набор символов, что и первая часть:
После этого проверяем доменную зону, которая состоит исключительно из строки букв определенного количества символов до конца строки:
Также с помощью регулярного выражения мы может выбрать все E-mail из текста:
В отличии от проверка правильности ввода E-mail, при выборке мы убрали в шаблоне символ начала (^) и конца ($) строки. Результат данного примера:
Проверка правильности ввода имени:
Проверка правильности ввода числа:
Корректность ввода даты:
Удалить все определения стилей Style:
Поскольку стили могут находится внутри практически любого тега, в примере удаляется исключительно само определение стиля без тега.

Удалить все определения строчных элементов документа Span:
Точно так же можно удалить любой тег, например, для заголовка H1:
Очистку таблиц с помощью регулярных выражений PHP можно осуществить так:
Проверить правильность имени файла можно с помощью следующего регулярного выражения:
Вырезать все изображения в тексте:
Найти все ссылки:
Представьте ситуацию, когда пользователь не использует символ пробела после точки или запятой. В данном случае получается весьма большое слово, которое не всегда может поместится в необходимое поле, что провоцирует горизонтальную прокрутку. Чтобы этого не случилось, можно воспользоваться следующим регулярным выражением, которое после точки или запятой будет добавлять символ пробела:
Найти все хештеги (#tag) можно так:
Или вручную добавить необходимые символы и их количество, разрешенные для составление хештегов:

Регулярные выражения и отрицание целой группы персонажей

Я пытаюсь что-то, что, по моему мнению, должно быть достаточно очевидным для меня, но это не так. Я пытаюсь сопоставить строку, которая НЕ содержит определенную последовательность символов. Я пробовал использовать [^ab] , [^(ab)] и т.д. Для соответствия строкам, не содержащим «a» или «b», или только «a» или «b», но не соответствует «ab». Примеры, которые я дал, не будут соответствовать «ab» it true, но они также не будут соответствовать «a» , и мне они нужны. Есть ли простой способ сделать это?

Используйте отрицательный просмотр:

ОБНОВЛЕНИЕ. В комментариях ниже я заявил, что этот подход медленнее, чем тот, который приведен в Питере.. С тех пор я провел несколько тестов и обнаружил, что это действительно немного быстрее. Однако причина предпочитать эту технику над другой — это не скорость, а простота.

Другой метод, описанный здесь как умеренный алчный токен, подходит для более сложных проблем, таких как сопоставление текста с разделителями, в котором разделители состоят из несколько символов (например, HTML, как Luke прокомментировал ниже). Для проблемы, описанной в вопросе, она переполняется.

Для всех, кто интересуется, я тестировал большой фрагмент текста Lorem Ipsum, подсчитывая количество строк, которые не содержат слова «quo». Это регулярные выражения, которые я использовал:

Я ищу поиск совпадений во всем тексте или разбиваю его на строки и сопоставляю их по отдельности, привязанный lookahead последовательно превосходит плавающий.

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

Задачи и их разборы с javascript.ru; в статье использованы комиксы xkcd.

Что такое регулярные выражения?

Если вам когда-нибудь приходилось работать с командной строкой, вы, вероятно, использовали маски имён файлов. Например, чтобы удалить все файлы в текущей директории, которые начинаются с буквы “d”, можно написать rm d* .

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

Реализация этого инструмента различается в разных языках программирования, хоть и не сильно. В данной статье мы будем ориентироваться в первую очередь на реализацию Perl Compatible Regular Expressions.

Основы синтаксиса

В первую очередь стоит заметить, что любая строка сама по себе является регулярным выражением. Так, выражению Хаха , очевидно, будет соответствовать строка “Хаха” и только она. Регулярные выражения являются регистрозависимыми, поэтому строка “хаха” (с маленькой буквы) уже не будет соответствовать выражению выше.

4 октября 2020 – 1 марта 2020, Москва и онлайн, беcплатно

Однако уже здесь следует быть аккуратным — как и любой язык, регулярные выражения имеют спецсимволы, которые нужно экранировать. Вот их список: . ^ $ * + ? < >[ ] \ | ( ) . Экранирование осуществляется обычным способом — добавлением \ перед спецсимволом.

Набор символов

Предположим, мы хотим найти в тексте все междометия, обозначающие смех. Просто Хаха нам не подойдёт — ведь под него не попадут “Хехе”, “Хохо” и “Хихи”. Да и проблему с регистром первой буквы нужно как-то решить.

Здесь нам на помощь придут наборы — вместо указания конкретного символа, мы можем записать целый список, и если в исследуемой строке на указанном месте будет стоять любой из перечисленных символов, строка будет считаться подходящей. Наборы записываются в квадратных скобках — паттерну [abcd] будет соответствовать любой из символов “a”, “b”, “c” или “d”.

Внутри набора большая часть спецсимволов не нуждается в экранировании, однако использование \ перед ними не будет считаться ошибкой. По прежнему необходимо экранировать символы “\” и “^”, и, желательно, “]” (так, [][] обозначает любой из символов “]” или «[», тогда как [[]х] – исключительно последовательность “[х]”). Необычное на первый взгляд поведение регулярок с символом “]” на самом деле определяется известными правилами, но гораздо легче просто экранировать этот символ, чем их запоминать. Кроме этого, экранировать нужно символ «-», он используется для задания диапазонов (см. ниже).

Если сразу после [ записать символ ^ , то набор приобретёт обратный смысл — подходящим будет считаться любой символ кроме указанных. Так, паттерну [^xyz] соответствует любой символ, кроме, собственно, “x”, “y” или “z”.

Итак, применяя данный инструмент к нашему случаю, если мы напишем [Хх][аоие]х[аоие] , то каждая из строк “Хаха”, “хехе”, “хихи” и даже “Хохо” будут соответствовать шаблону.

Предопределённые классы символов

Для некоторых наборов, которые используются достаточно часто, существуют специальные шаблоны. Так, для описания любого пробельного символа (пробел, табуляция, перенос строки) используется \s , для цифр — \d , для символов латиницы, цифр и подчёркивания “_” — \w .

Если необходимо описать вообще любой символ, для этого используется точка — . . Если указанные классы написать с заглавной буквы ( \S , \D , \W ) то они поменяют свой смысл на противоположный — любой непробельный символ, любой символ, который не является цифрой, и любой символ кроме латиницы, цифр или подчёркивания соответственно.

Также с помощью регулярных выражений есть возможность проверить положение строки относительно остального текста. Выражение \b обозначает границу слова, \B — не границу слова, ^ — начало текста, а $ — конец. Так, по паттерну \bJava\b в строке “Java and JavaScript” найдутся первые 4 символа, а по паттерну \bJava\B — символы c 10-го по 13-й (в составе слова “JavaScript”).

Комикс про регулярные выражения с xkcd.ru

Диапазоны

У вас может возникнуть необходимость обозначить набор, в который входят буквы, например, от “б” до “ф”. Вместо того, чтобы писать [бвгдежзиклмнопрстуф] можно воспользоваться механизмом диапазонов и написать [б-ф] . Так, паттерну x[0-8A-F][0-8A-F] соответствует строка “xA6”, но не соответствует “xb9” (во-первых, из-за того, что в диапазоне указаны только заглавные буквы, во-вторых, из-за того, что 9 не входит в промежуток 0-8).

Механизм диапазонов особенно актуален для русского языка, ведь для него нет конструкции, аналогичной \w . Чтобы обозначить все буквы русского алфавита, можно использовать паттерн [а-яА-ЯёЁ] . Обратите внимание, что буква “ё” не включается в общий диапазон букв, и её нужно указывать отдельно.

Квантификаторы (указание количества повторений)

Вернёмся к нашему примеру. Что, если в “смеющемся” междометии будет больше одной гласной между буквами “х”, например “Хаахаааа”? Наша старая регулярка уже не сможет нам помочь. Здесь нам придётся воспользоваться квантификаторами.

Квантификатор Число повторений Пример Подходящие строки
Ровно n раз Ха<3>ха Хаааха
От m до n включительно Ха<2,4>ха Хаа, Хааа, Хааааха
Не менее m Ха<2,>ха Хааха, Хаааха, Хааааха и т. д.
Не более n Ха<,3>ха Хха, Хаха, Хааха, Хаааха

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

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

Квантификатор Аналог Значение
? Ноль или одно вхождение
* Ноль или более
+ Одно или более

Таким образом, с помощью квантификаторов мы можем улучшить наш шаблон для междометий до [Хх][аоеи]+х[аоеи]* , и он сможет распознавать строки “Хааха”, “хееееех” и “Хихии”.

Ленивая квантификация

Предположим, перед нами стоит задача — найти все HTML-теги в строке

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

Это происходит из-за того, что по умолчанию квантификатор работают по т.н. жадному алгоритму — старается вернуть как можно более длинную строку, соответствующую условию. Решить проблему можно двумя способами. Первый — использовать выражение ]*> , которое запретит считать содержимым тега правую угловую скобку. Второй — объявить квантификатор не жадным, а ленивым. Делается это с помощью добавления справа к квантификатору символа ? . Т.е. для поиска всех тегов выражение обратится в .

Ревнивая квантификация

Иногда для увеличения скорости поиска (особенно в тех случаях, когда строка не соответствует регулярному выражению) можно использовать запрет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения. Это называется ревнивой квантификацией. Квантификатор делается ревнивым с помощью добавления к нему справа символа + . Ещё одно применение ревнивой квантификации — исключение нежелательных совпадений. Так, паттерну ab*+a в строке “ababa” будут соответствовать только первые три символа, но не символы с третьего по пятый, т.к. символ “a”, который стоит на третьей позиции, уже был использован для первого результата.

Скобочные группы

Для нашего шаблона “смеющегося” междометия осталась самая малость — учесть, что буква “х” может встречаться более одного раза, например, “Хахахахааахахооо”, а может и вовсе заканчиваться на букве “х”. Вероятно, здесь нужно применить квантификатор для группы [аиое]+х , но если мы просто напишем [аиое]х+ , то квантификатор + будет относиться только к символу “х”, а не ко всему выражению. Чтобы это исправить, выражение нужно взять в круглые скобки: ([аиое]х)+ .

Таким образом, наше выражение превращается в [Хх]([аиое]х?)+ — сначала идёт заглавная или строчная “х”, а потом произвольное ненулевое количество гласных, которые (возможно, но не обязательно) перемежаются одиночными строчными “х”. Однако это выражение решает проблему лишь частично — под это выражение попадут и такие строки, как, например, “хихахех” — кто-то может быть так и смеётся, но допущение весьма сомнительное. Очевидно, мы можем использовать набор из всех гласных лишь единожды, а потом должны как-то опираться на результат первого поиска. Но как?…

Запоминание результата поиска по группе (обратная связь)

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

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

”.
Результат поиска по первой группе: “p”, “b”, “/b”, “i”, “/i”, “/i”, “/p”.

На результат поиска по группе можно ссылаться с помощью выражения \n , где n — цифра от 1 до 9. Например выражению (\w)(\w)\1\2 соответствуют строки “aaaa”, “abab”, но не соответствует “aabb”.

Если выражение берётся в скобки только для применения к ней квантификатора (не планируется запоминать результат поиска по этой группе), то сразу после первой скобки стоит добавить ?: , например (?:[abcd]+\w) .

С использованием этого механизма мы можем переписать наше выражение к виду [Хх]([аоие])х?(?:\1х?)* .

Перечисление

Чтобы проверить, удовлетворяет ли строка хотя бы одному из шаблонов, можно воспользоваться аналогом булевого оператора OR, который записывается с помощью символа | . Так, под шаблон Анна|Одиночество попадают строки “Анна” и “Одиночество” соответственно. Особенно удобно использовать перечисления внутри скобочных групп. Так, например (?:a|b|c|d) полностью эквивалентно [abcd] (в данном случае второй вариант предпочтительнее в силу производительности и читаемости).

С помощью этого оператора мы сможем добавить к нашему регулярному выражению для поиска междометий возможность распознавать смех вида “Ахахаах” — единственной усмешке, которая начинается с гласной: [Хх]([аоие])х?(?:\1х?)*|[Аа]х?(?:ах?)+

Полезные сервисы

Потренироваться и / или проверить своё регулярное выражение на каком-либо тексте без написания кода можно с помощью таких сервисов, как RegExr, Regexpal или Regex101. Последний, вдобавок, приводит краткие пояснения к тому, как регулярка работает.

Разобраться, как работает регулярное выражение, которое попало к вам в руки, можно с помощью сервиса Regexper — он умеет строить понятные диаграмы по регулярному выражению.

RegExp Builder — визуальный конструктор функций JavaScript для работы с регулярными выражениями.

Больше инструментов можно найти в нашей подборке.

Задания для закрепления

Найдите время

Время имеет формат часы:минуты. И часы, и минуты состоят из двух цифр, пример: 09:00. Напишите регулярное выражение для поиска времени в строке: “Завтрак в 09:00”. Учтите, что “37:98” – некорректное время.

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

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

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

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

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

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

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

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

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

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

Данные выражения равнозначны и соответствуют каждой цифре.

Создавая РВ, воспользуйтесь групповым символом «.». Он осуществляет объединение пары одиночных символов (кроме \n):

Данное выражение также соответствует таким строкам, как «док», «кок», «ток».

соответствует той строке, которая содержит символ х (за ним должны идти цифры от 0 до 9 и те или иные символы). Данному критерию удовлетворяют такие строки, как, например, «xz1», «xl2».

РВ может содержать некоторое количество ветвей, разделяющихся символом |. Он действует в роли оператора ИЛИ (OR). При использовании в выражении ветвей одна из них должна соответствовать строке «abc|абв».

Данному РВ соответствуют строки, которые содержат подстроки — «абв» или «abc». Обычно ветвление используется для того, чтобы проверить зоны доменов, имен и расширений файлов. Нижеприведенное РВ осуществляет проверку на наличие в строке подстрок «net», «com» и «ru».

Чтобы исключить из поиска определенную последовательность символов, перед ней необходимо наличие символа «^».

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

Для уточнения РВ вы можете воспользоваться квалификаторами — такими символами, как *, ? +. Они указывают на количество последовательностей символов в строке. Их необходимо указать после части выражения, в которой вам необходимо их использовать:

  • “а*” — 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 строкам.

Сопоставление со специальными символами

Если перед символом имеется обратная косая черта, то это свидетельствует о том, что для записи символа была использована escape-последовательность.

Это же можно отнести и к символу косой черты. Для сопоставления с этим символом необходимо написать две черты — \\.

Классами символов представляют собой сокращенные названия, предназначенные для предопределенных символов. Перечислим данные классы и символы:

  • [[:alnum:]]- буквенно-цифровые;
  • [[:digit:]]- десятичные цифровые;
  • [[:xdigit:]]- шестнадцатеричные цифровые;
  • [[:alpha:]]- буквенные;
  • [[:upper:]]- прописные буквенные;
  • [[:lower:]]- строчные буквенные;
  • [[:punct:]]- знаки пунктуации
  • [[:space:]]- пробел;
  • [[:blanc:]]- табуляция и пробел;
  • [[:print:]]- печатные;
  • [[:cntrl:]]- управляющие;
  • [[:graph:]]- печатные символы (кроме пробелов).

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

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

В PHP есть поддержка 2 типов записи РВ — POSIX и Perl. POSIX (Portable Operating System Interface) представляет собой интерфейс переносной операционной системы и стандарт для интерфейсов приложений. Сейчас мы рассмотрим РВ POSIX и Perl-совместимые РВ.

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

Эта функция осуществляет поиск соответствия РВ в строке string, который задан в шаблоне pattern. В случае наличия соответствий шаблона с подвыражениями их сохранят в массиве соответствий regs. В $regs[0] имеется копия строки string, а в $regs[1] находится подстрока, которая начинается с первой левой скобки. Подстрока со второй левой скобки хранится в $regs[2] и т. д.

Рассмотрим код, который из формата YYYY-MM-DD преобразовывает формат даты в DD.MM.YYYY.

Данная функция меняет шаблон pattern, который был обнаружен в строке string, на строку replacement. При наличии соответствия происходит осуществление модифицированной строки.

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

до замены: Он родился в пятьдесят втором.после замены: Он родился в 1952.

Данная функция аналогична ereg. Отличие состоит в том, что регистр игнорируется.

Отличие данной функции от ereg_replace состоит в том, что она не является чувствительной к регистру.

Данная функция проводит возвращение массива строк из подстрок строк string, которые были образованы в соответствии с РВ pattern в ходе разделения строки string на подстроки. При указании параметра limit (он не является обязательным) возвращаемый массив будет иметь до limit элементов, причем в последнем имеется неразделенная часть строки.

Данная функция окажет пользу при разделении доменных имен, дат и проч. Например:

В результате будет следующее:

Это же можно осуществить и с датой:

В результате мы получим:

Данная функция похожа на split, однако не является чувствительной к регистру.

Топ-пост этого месяца:  Википедия — что это такое, ее история, wiki-движки, разметка и создание статей в народной
Добавить комментарий