Php

Регулярные выражения php шпаргалка: Регулярные выражения в PHP

Содержание

Регулярные выражения PCRE в PHP. Шпаргалка c примерами. — Oh, MSBRO !

символописаниепримерстрока и соответствие
обычныевсе символы , кроме специальных. Соответствуют сами себеапричал
отот кота
12612-2123
специальные символы

[ ] \ ^ $ . | ? * + ( ) { }

Чтобы использовать как сиволы текста, нужно их предварить «\»\(812\)тел. (812)812-24-15
0\.5320.5 3205
е\?Что? Где? Когда?
^Начало строки^аааааа
^мамарт или май
$Конец строкиa$ааа аа$
^бег$бег
бегун
\bГраница словаа\bа он когда завтра?
\bонвон он
\BНе граница слова\Bонвон он
\GПредыдущий успешный поиск\Gaaaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a)
.любой символ кроме символа новой строки «\n»м.ймой май мама
Символьный класс — Набор символов в квадратных скобках [ ]в данном месте — один из перечисленных символов2[19]5215 265 21 295
он[?!]тон? Нет, не тон. Полутон!
Возможно указание диапазонов символов. [0-9] соответствует любой цифре. [А-Яа-я] — любая буква русского алфавита кроме «ё» и «Ё»2[0-9]4204 24 234
л[А-Яа-я]нлуна лень лён слОн
л[А-Яа-яёЁ]нлуна лень лён слОн
[^] -символ, который не входит в набор[^0-9]212или 213 конфет
\dСоответствует цифре. Эквивалентно [0-9]img\dimg5 img74 img
\DСоответствует нецифровому символу. Эквивалентно [^0-9]
\sСоответствует любому пробельному символу. Эквивалентно [ \f\n\r\t\v]
\SСоответствует любому непробельному символу. Эквивалентно [^ \f\n\r\t\v]
\wСоответствует любому буквенному символу, цифровому и знаку подчеркивания. Эквивалентно [[:word:]]
\WСоответствует любому символу, кроме буквенного символа, цифрового или подчеркивания. Эквивалентно [^[:word:]]
Квантификация (сколько раз предшествующее выражение может встречаться.)
{n}ровно n раз[0-9]{3}316 29 15 1
{m,n}от m до n раз[0-9]{2,3}316 29 15 1
{m,}не менее m разcто{2,}йстой, стоой, стооой
{0,n}не более n разсто{0,3}йстой, стоой, стооой, стоооой
*ноль или более раз. Эквивалентно {0,}сто*ст сто стоо
+Один или более раз. Эквивалентно {1,}сто+ст сто стоо
?Ноль или одно. Эквивалентно {0,1}сто?ст сто стоо
cт?лстол стул ст5л стл
Жадная и ленивая квантификация
Жадная квантификацияМаксимально длинная строка из возможных

Обычные квантификаторы * + ? {m,n} являются жадными

 

<.*><span>123</span>
\(.+\)(812)234, (812)235
cт.{3,}йстооооой. Что это за лай
Ленивая квантификация

*? +? ?? {m,n}?

Минимально длинная строка из возможных<.*?><span>123</span>
\(.+?\)(812)234,(812)235
ст.{3,}?йстооооой. Что это за лай
Сверхжадная

*+ ++ ?+ {m,n+}

Действует как жадный, при этом не возвращается к точке возврата

подробнее

<.*+><span>123</span>

Соответствие не будет найдено, поскольку после символа «<» .*+ «скушает» все оставшиеся: span>123</span> . После чего символ «>» будет не найден.

Группировка
()для групировки. Шаблон внутри как единое целое. может быть квантифицирован([a-z][0-9]-)+a7-b9-c26-e5-d13
(ab){3}abcabababcdab
для получения значениясегодня ([0-9]+)сегодня 18 января. $1 — вернёт ’18’
группировка без обратной связи
(?:)
отмена получения значения.сегодня (?:[0-9]+)$1 ничего не вернёт
() \1 … \9обозначения от \1 до \9 для проверки на совпадение с ранее найденной подстрокой([0-9])\188, 96, 99, 25, 11
([а-я])[а-я]*\1сос, нос, кок, тот
(..|..)или первая часть или вторая(\+7|8)-[0-9-]*8-812-243-12-63, +7-376-9052412
(он|ты|я)я, ты, он, она — вместе дружная семья
атомарная групировка (?>шаблон)запрещает проверку любых других вариантов внутри группы, когда один вариант уже найден. + отмена получения значенияa(?>bc|b|x)ccabccaxcc
но не abccaxcc : вариант x найден, остальные проигнорированы. $1 тоже ничего не вернёт
(?i) (?s) (?m) (?g) (?x) (?r)Включает соответствующий модификатор(?i)onEonE, one, OnE
(?-i) (?-s) (?-m) (?-g) (?-x) (?-r)Выключает модификатор(?-i)onEonE, oNe, one, OnE
(?i-sm)Включает и выключает несколько модификаторов
(?i-s:шаблон)Включает/Выключает модификаторы только в пределах группы(?i)o(?-i:n)EonE, oNe, one, OnE, oNE

буква n должна быть маленькой

(?#комментарий)группа не проверяется на вхождение в текст.[0-9](?#одна цифра)d5

Регулярные выражения PCRE в PHP. Шпаргалка c примерами

символописаниепримерстрока и соответствие
обычныевсе символы , кроме специальных. Соответствуют сами себеапричал
отот кота
12612-2123
специальные символы

[ ] \ ^ $ . | ? * + ( ) { }

Чтобы использовать как сиволы текста, нужно их предварить «\»\(812\)тел. (812)812-24-15
0\.5320.5 3205
е\?Что? Где? Когда?
^Начало строки^аааааа
^мамарт или май
$Конец строкиa$ааа аа$
^бег$бег
бегун
\bГраница словаа\bа он когда завтра?
\bонвон он
\BНе граница слова\Bонвон он
\GПредыдущий успешный поиск\Gaaaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a)
.любой символ кроме символа новой строки «\n»м.ймой май мама
Символьный класс — Набор символов в квадратных скобках [ ]в данном месте — один из перечисленных символов2[19]5215 265 21 295
он[?!]тон? Нет, не тон. Полутон!
Возможно указание диапазонов символов. [0-9] соответствует любой цифре. [А-Яа-я] — любая буква русского алфавита кроме «ё» и «Ё»2[0-9]4204 24 234
л[А-Яа-я]нлуна лень лён слОн
л[А-Яа-яёЁ]нлуна лень лён слОн
[^] -символ, который не входит в набор[^0-9]212 или 213 конфет
\dСоответствует цифре. Эквивалентно [0-9]img\dimg5 img74 img
\DСоответствует нецифровому символу. Эквивалентно [^0-9]
\sСоответствует любому пробельному символу. Эквивалентно [ \f\n\r\t\v]
\SСоответствует любому непробельному символу. Эквивалентно [^ \f\n\r\t\v]
\wСоответствует любому буквенному символу, цифровому и знаку подчеркивания. Эквивалентно [[:word:]]
\WСоответствует любому символу, кроме буквенного символа, цифрового или подчеркивания. Эквивалентно [^[:word:]]

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

{n}ровно n раз[0-9]{3}316 29 15 1
{m,n}от m до n раз[0-9]{2,3}316 29 15 1
{m,}не менее m разcто{2,}йстой, стоой, стооой
{0,n}не более n разсто{0,3}йстой, стоой, стооой, стоооой
*ноль или более раз. Эквивалентно {0,}сто*ст сто стоо
+Один или более раз. Эквивалентно {1,}сто+ст сто стоо
?Ноль или одно. Эквивалентно {0,1}сто?ст сто стоо
cт?лстол стул ст5л стл

Жадная и ленивая квантификация

Жадная квантификацияМаксимально длинная строка из возможных

Обычные квантификаторы * + ? {m,n} являются жадными

 

<.*><span>123</span>
\(.+\)(812)234, (812)235
cт.{3,}йстооооой. Что это за лай
Ленивая квантификация

*? +? ?? {m,n}?

Минимально длинная строка из возможных <.*?><span>123</span>
\(.+?\)(812)234,(812)235
ст.{3,}?йстооооой. Что это за лай
Сверхжадная

*+ ++ ?+ {m,n+}

Действует как жадный, при этом не возвращается к точке возврата

подробнее

<.*+> <span>123</span>

Соответствие не будет найдено, поскольку после символа «<»
.*+ «скушает» все оставшиеся:
span>123</span> . После чего символ «>» будет не найден.

Группировка

()для групировки. Шаблон внутри как единое целое. может быть квантифицирован([a-z][0-9]-)+a7-b9-c26-e5-d13
(ab){3}abcabababcdab
для получения значениясегодня ([0-9]+)сегодня 18 января. $1 — верёт ’18’
группировка без обратной связи
(?:)
отмена получения значения.сегодня (?:[0-9]+)$1 ничего не вернёт
() \1 … \9обозначения от \1 до \9 для проверки на совпадение с ранее найденной подстрокой([0-9])\188, 96, 99, 25, 11
([а-я])[а-я]*\1сос, нос, кок, тот
(..|..)или первая часть или вторая(\+7|8)-[0-9-]*8-812-243-12-63, +7-376-9052412
(он|ты|я)я, ты, он, она — вместе дружная семья
атомарная групировка (?>шаблон)запрещает проверку любых других вариантов внутри группы, когда один вариант уже найден. + отмена получения значенияa(?>bc|b|x)ccabccaxcc
но не abccaxcc : вариант x найден, остальные проигнорированы. $1 тоже ничего не вернёт
(?i) (?s) (?m) (?g) (?x) (?r)Включает соответствующий модификатор(?i)onEonE, one, OnE
(?-i) (?-s) (?-m) (?-g) (?-x) (?-r)Выключает модификатор(?-i)onEonE, oNe, one, OnE
(?i-sm)Включает и выключает несколько модификаторов
(?i-s:шаблон)Включает/Выключает модификаторы только в пределах группы(?i)o(?-i:n)EonE, oNe, one, OnE, oNE

буква n должна быть маленькой

(?#комментарий)группа не проверяется на вхождение в текст.[0-9](?#одна цифра)d55d5, d6, 67d5

Шпаргалка по регулярным выражениям — Портал программирования

* (?= шаблон) — после этой точки есть фрагмент текста, который соответствует указанному регулярному выражению
* (?! шаблон) — после этой точки нет текста, который бы соответствовал указанному регулярному выражению,
* (?<= шаблон) — перед этой точкой есть фрагмент текста, соответствующий указанному регулярному выражению,
* (?<! шаблон) — перед этой точкой нет фрагмента текста, соответствующего указанному регулярному выражению.
* (?#текст) — комментарий. Текст комментария игнорируется.
* (?:шаблон) или (?модификаторы:шаблон) — группирует элементы шаблона. В отличие от обычных круглых скобок, не создает нумерованной переменной. Например, модификатор i не будет делать различия между строчными и заглавными буквами, однако область действия этого модификатора будет ограничена только указанным шаблоном.
* (?=шаблон) — «заглядывание вперед». Требует, чтобы после текущей точки находился текст, соответствующий данному шаблону. Такая, конструкция обрабатывается как условие или мнимый символ, поскольку не включается В результат поиска. Например, поиск с помощью команды /w+(?=\s+)/ найдет слово, за которым следуют один или несколько «пробельных символов», однако сами они в результат не войдут.
* (?!шаблон) — случай, противоположный предыдущему. После текущей точки не должно быть текста, соотносимого с заданным шаблоном. Так, если шаблон w+(?=\s) — это слово, за которым следует «пробельный символ», то шаблон w+(?!\s) — это слово, за которым мет «пробельного символа».
* (?<=шаблон) — заглядывание назад. Требует, чтобы перед текущей точкой находился соответствующий текст. Так, шаблон (?<=\s)w+ интерпретируется как слово, перед которым имеется пробельный символ (в отличие от заглядывания вперед, заглядывание назад может работать только с фиксированным числом проверяемых символов).
* (?<!шаблон) — отрицание предыдущего условия. Перед текущей точкой не должно быть текста, соотносимого с заданным шаблоном. Соответственно, от команды /(?<!\s)w+/ требуется найти слово, перед которым нет пробельного символа.
* (?{код}) — условие (мнимый символ которое всегда выполняется. Сводится к выполнению команд perl в фигурных скобках. Вы можете использовать эту конструкцию, только если в начале сценария указана команда use re ‘eval’. При последовательном соотнесении текста и шаблона, когда perl доходит до такой конструкции, выполняется указанный код. Если полного соответствия для оставшихся элементов найти не удалось, то при возврате левее данной точки шаблона вычисления, проделанные с локальными переменными, откатываются назад. (Условие является экспериментальным. В документации, прилагаемой в perl, можно найти довольно детальное рассмотрение (с примерами) работы этого условия и возможных трудностей в случае его применения.)
* (?>шаблон) — «независимый» или «автономный» шаблон. Используется для оптимизации процесса поиска, поскольку запрещает «поиск с возвратом». Такая конструкция соответствует подстроке, на которую налагается заданный шаблон, если его закрепить в текущей точке без учета последующих элементов шаблона. Например, шаблон (?>а*)аb в отличие от a*ab не может соответствовать никакой строке. Если поставить в любом месте шаблон а*, он съест все буквы а, не оставив ни одной шаблону ab. (Для шаблона а*аb «аппетит» квантификатор * будет ограничен за счет работы поиска с возвратами: после того как на первом этапе не удастся найти соответствие между шаблоном и текстом, perl сделает шаг назад и уменьшит количество букв а, захватываемых конструкцией а*.)
* (?(условие)шаблон-да|шаблон-нет) или (?(условие)шаблон-да) — условный оператор, который подставляет тот или иной шаблон в зависимости от выполнения заданного условия. Более подробно описан в документации perl.
* (?модификаторы) — задает модификаторы, которые локальным образом меняют работу процедуры поиска. В отличие от глобальных модификаторов, имеют силу только для текущего блока, то есть для ближайшей группы круглых скобок, охватывающих конструкцию, Например, шаблон ?i)text) соответcтвует слову «text» без учета регистра.

Php регулярные выражения символ — Вэб-шпаргалка для интернет предпринимателей!

Квантификаторы

АналогПримерОписание
?a?одно или ноль вхождений «а»
+a+одно или более вхождений «а»
*a*ноль или более вхождений «а»

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

Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.

Описание
gглобальный поиск (обрабатываются все совпадения с шаблоном поиска)
iигнорировать регистр
mмногострочный поиск. Поясню: по умолчанию текст это одна строка, с модификатором есть отдельные строки, а значит ^ — начало строки в тексте, $ — конец строки в тексте.
sтекст воспринимается как одна строка, спец символ «точка» (.) будет вкючать и перевод строки
uиспользуется кодировка UTF-8
Uинвертировать жадность
xигнорировать все неэкранированные пробельные и перечисленные в классе символы

Спецсимволы

АналогОписание
()подмаска, вложенное выражение
[]групповой символ
количество вхождений от «a» до «b»
|логическое «или», в случае с односимвольными альтернативами используйте []
экранирование спец символа
.любой сивол, кроме перевода строки
d[0-9]десятичная цифра
D[^d]любой символ, кроме десятичной цифры
fконец (разрыв) страницы
перевод строки
pLбуква в кодировке UTF-8 при использовании модификатора u
возврат каретки
s[ v
f]
пробельный символ
S[^s]любой символ, кроме промельного
табуляция
w[0-9a-z_]любая цифра, буква или знак подчеркивания
W[^w]любой символ, кроме цифры, буквы или знака подчеркивания
vвертикальная табуляция

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

ПримерОписание
^[^da]отрицание, любой символ кроме «d» или «a»
[a-z]интервал, любой симво от «a» до «z»

Позиция внутри строки

ПримерСоответствиеОписание
^^aaaa aaaначало строки
$a$aaa aaaконец строки
AAaaaa aaa
aaa aaa
начало текста
zazaaa aaa
aaa aaa
конец текста
a
a
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий — нет, либо наоборот
BBaBaaa aaaотсутствие границы слова
GGaaaa aaaПредыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a

Скачать в PDF, PNG.

Якоря

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

Здесь символ ^ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.

Символьные классы

Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, d соответствует любой цифре от 0 до 9 включительно, w соответствует буквам и цифрам, а W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

POSIX

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

Утверждения

Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».

Приведенный выше код начинается с поиска любых символов, кроме пробела ( [^s]* ), за которыми следует q . Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным ( ?! ), т. е. оно будет верным, если то, что в нем ищется, не будет найдено.

Итак, парсер проверяет несколько следующих символов по предложенному шаблону ( werty ). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ( [^s]* ).

Кванторы

Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

По умолчанию кванторы — «жадные». Поэтому квантор + , означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:

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

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

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

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

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

Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать « . » в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

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

Шаблон для нахождения точки таков:

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

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

Подстановка строк

Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.

Группы и диапазоны

Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:

Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:

Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

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

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ( [0-9]+ ), и наконец 1 . Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Таким образом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как 1 будет искать «aaa» после числа.

Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. При замене текста можно сослаться на найденную группу, используя $n . Скажем, вы хотите выделить в тексте все слова «wish» жирным начертанием. Для этого вам следует использовать функцию замены по регулярному выражению, которая может выглядеть так:

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

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

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1 . Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ( $3 ). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или ), выделив им вторую группу, найденную по шаблону ( $2 ).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.

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

Модификаторы добавляются в конец этой строки, вот так:

Мета-символы

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

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]<6>» (если, например, от шести до восьми цифр, тогда «[0-9]<6,8>»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

Вместо набора символов может быть использовано обозначение любого символа — точка, может быть указан конкретный набор символов (поддерживаются последовательности — упоминавшиеся «0-9»). Может быть указано «кроме данного набора символов».

Указатель количества символов в официальной документации по php называется «квантификатор». Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение — либо одно фиксированное («<6>»), либо как числовой промежуток («<6,8>»), так и абстрактное «любое число, в т.ч. 0» («*»), «любое натуральное число» — от 1 до бесконечности («+»: «document[0-9]+.txt»), «либо 0, либо 1» («?»). По умолчанию квантификатор для данного набора символов равен единице («document[0-9].txt»).

Для более гибкого поиска сочетаний эти связки «набор символов — квантификатор» можно объединять в метаструктуры.

Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая «там» строка. Из примеров: поисковый код , в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: » +» заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация «(.*)» в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон «двигается» программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация «(.*)» означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

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

.точкалюбой символ
[ ]квадратные скобкикласс символов («любое из»). Например [abcdef]
[^ ]негативный класс символов («любое кроме»)
тиреобозначение последовательности в классе символов («[0-9]» — цифры)
d[0-9]Только цифры
D[^0-9]Кроме цифр
w[a-z0-9]Буквы и цифры
W[^a-z0-9]Кроме букв и цифр
s[ ]Пробельные символы: пробел, табуляция, перевод строки
S[^ ]Кроме пробельных символов
|(одно|другое)На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: . )

Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

Квантификатор

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

Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

*«звёздочка» или знак умножения
+плюс
?вопросительный знак

На практике такие символы используются чаще, чем фигурные скобки.

Якоря

^привязка к началу строки
$привязка к концу строки

Эти символы должны стоять соответственно в самом начале и в самом конце строки.

Жадность

Вопросительный знак выступает еще и как минимизатор квантификатора:
.*?

Результат работы примера:

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

iрегистронезависимый поиск
m

многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы «^» и «$» совпадают только с началом и концом всего текста. Когда этот параметр установлен, «^» и «$» совпадают с началом и концом отдельных строк.

sсимвол «.» (точка) совпадает и с переносом строки (по умолчанию — нет)Aпривязка к началу текстаEзаставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m.UИнвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»).eСтрока замены интерпретитуется как PHP код.

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

  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match — Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_quote — Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т.п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену
  • preg_split — Разбивает строку по регулярному выражению
preg_grep

Функция preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

array preg_grep (string pattern, array input [, int flags])

preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.

Параметр flags может принимать следующие значения:

PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:

preg_match

Функция preg_match — Выполняет проверку на соответствие регулярному выражению

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

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

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

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

Пример кода
Пример кода
Пример кода
preg_match_all

Функция preg_match_all — Выполняет глобальный поиск шаблона в строке

int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])

Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.

После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

Пример кода

Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

Пример кода

В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

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

В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

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

Пример кода
Пример кода
preg_quote

Функция preg_quote — Экранирует символы в регулярных выражениях

string preg_quote (string str [, string delimiter])

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’.

В регулярных выражениях служебными считаются следующие символы: . \ + * ? [ ^ ] $ ( ) < >= ! | :

Пример кода
Пример кода
preg_replace

Функция preg_replace — Выполняет поиск и замену по регулярному выражению

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Replacement может содержать ссылки вида \n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n’нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией $<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.

Результатом работы этого примера будет:

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

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

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

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

Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример кода: Замена по нескольким шаблонам

Этот пример выведет:

Пример кода: Использование модификатора /e
Пример кода: Преобразует все HTML-теги к верхнему регистру
preg_replace_callback

Функция preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

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

Пример кода
preg_split

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

array preg_split (string pattern, string subject [, int limit [, int flags]])

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

В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок. Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.

flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):

PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.

PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.

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

Примеры кода

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

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

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._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «

«‘/…/’» начинает и завершает регулярное выражение.
«^[a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@[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 » , подготовленной дружной командой проекта Интернет-технологии.ру

Рекомендуем к прочтению

Как новичку разобраться в регулярных выражениях

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

Все изменилось, когда мне пришлось более плотно работать с Google Analytics и Google Tag Manager в Netpeak. Без понимания регулярных выражений сложно представить себе нормальную настройку фильтров, пользовательских сегментов в GA или правил в GTM.

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

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

Регулярные выражения (regular expressions, RegExp) — наборы символов, применяемых для поиска текстовых строк, соответствующих требуемым условиям. Результат применения регулярного выражения — подмножество данных, отобранное согласно логике, заложенной в выражении. Регулярные выражения применяются в любых задачах по поиску в множестве данных, для которых нужно получать выжимку по определенным правилам.

Синтаксис регулярных выражений

Большинство символов в регулярных выражениях представляют сами себя, за исключением группы специальных символов «[ ] \ / ^ $ . | ? * + ( ) { }». Если эти символы нужно представить в качестве символов текста, их следует экранировать обратной косой чертой «\».

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

  • «^» — каретка, циркумфлекс или просто галочка. Начало строки;
  • «$» — знак доллара. Конец строки;
  • «.» — точка. Любой символ;
  • «*» – знак умножения, звездочка. Любое количество предыдущих символов;
  • «+» – плюс. 1 или более предыдущих символов;
  • «?» – вопросительный знак. 0 или 1 предыдущих символов;
  • «( )» – круглые скобки. Группировка конструкций;
  • «|» – вертикальная линия. Оператор «ИЛИ»;
  • «[ ]» – квадратные скобки. Любой из перечисленных символов, диапазон. Если первый символ в этой конструкции – «^», то массив работает наоборот – проверяемый символ не должен совпадать с тем, что перечислено в скобках;
  • «{ }» – фигурные скобки. Повторение символа несколько раз;
  • «\» – обратный слеш. Экранирование служебных символов.

Также существуют специальные метасимволы, ими можно заменить некоторые готовые конструкции:

  • \b — обозначает не символ, а границу между символами;
  • \d — цифровой символ;
  • \D — нецифровой символ;
  • \s — пробельный символ;
  • \S — непробельный символ;
  • \w — буквенный или цифровой символ или знак подчеркивания;
  • \W — любой символ, кроме буквенного или цифрового символа или знака подчеркивания.

{«0»:{«lid»:»1573230077755″,»ls»:»10″,»loff»:»»,»li_type»:»em»,»li_name»:»email»,»li_ph»:»Email»,»li_req»:»y»,»li_nm»:»email»},»1″:{«lid»:»1596820612019″,»ls»:»20″,»loff»:»»,»li_type»:»hd»,»li_name»:»country_code»,»li_nm»:»country_code»}}

Истории бизнеса и полезные фишки

Пять способов протестировать свои знания о регулярных выражениях

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

1. Изучаем регулярные выражения в текстовом редакторе

Почти всем новичкам я сразу рекомендую ставить текстовый редактор NotePad++ и начинать тренироваться в нём. Почему именно в этом текстовом редакторе:

  • в большинстве случаев спецсимволы не нужно экранировать;
  • Notepad++ сохраняет конструкции предыдущих запросов;
  • функция «Пометки» наглядно показывает результат поиска по заданной конструкции и позволяет быстро внести правки:

список полезных регулярных выражений PHP

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

Просто жуть!

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

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

Полезные паттерны

Вот список регулярных выражений PHP, которые часто востребованы среди «сайтостроителей»:

Ищем email

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Паттерн для проверки пароля длинной 7-21 символов, состоящего из латинских символов, цифр, нижнего подчеркивания и тире

Ищем графические файлы определенного формата

Ищем строку, начинающуюся с указанного слова:

Ищем строку, заканчивающуюся указанным словом:

Если у вас есть примеры для этого списка регулярных выражений PHP, поделитесь ими в комментариях к материалу. Авось кому-то из коллег пригодится .

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Хотите изучить регулярные выражения на PHP?

Посмотрите 12-ти часовой видео курс по регулярным выражениям на PHP!

Смотреть

Php preg match регулярные выражения

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

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._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «

«‘/…/’» начинает и завершает регулярное выражение.
«^[a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@[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 » , подготовленной дружной командой проекта Интернет-технологии.ру

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]<6>» (если, например, от шести до восьми цифр, тогда «[0-9]<6,8>»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

Вместо набора символов может быть использовано обозначение любого символа — точка, может быть указан конкретный набор символов (поддерживаются последовательности — упоминавшиеся «0-9»). Может быть указано «кроме данного набора символов».

Указатель количества символов в официальной документации по php называется «квантификатор». Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение — либо одно фиксированное («<6>»), либо как числовой промежуток («<6,8>»), так и абстрактное «любое число, в т.ч. 0» («*»), «любое натуральное число» — от 1 до бесконечности («+»: «document[0-9]+.txt»), «либо 0, либо 1» («?»). По умолчанию квантификатор для данного набора символов равен единице («document[0-9].txt»).

Для более гибкого поиска сочетаний эти связки «набор символов — квантификатор» можно объединять в метаструктуры.

Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая «там» строка. Из примеров: поисковый код , в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: » +» заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация «(.*)» в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон «двигается» программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация «(.*)» означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

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

.точкалюбой символ
[ ]квадратные скобкикласс символов («любое из»). Например [abcdef]
[^ ]негативный класс символов («любое кроме»)
тиреобозначение последовательности в классе символов («[0-9]» — цифры)
d[0-9]Только цифры
D[^0-9]Кроме цифр
w[a-z0-9]Буквы и цифры
W[^a-z0-9]Кроме букв и цифр
s[ ]Пробельные символы: пробел, табуляция, перевод строки
S[^ ]Кроме пробельных символов
|(одно|другое)На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: . )

Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

Квантификатор

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

Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

*«звёздочка» или знак умножения
+плюс
?вопросительный знак

На практике такие символы используются чаще, чем фигурные скобки.

Якоря

^привязка к началу строки
$привязка к концу строки

Эти символы должны стоять соответственно в самом начале и в самом конце строки.

Жадность

Вопросительный знак выступает еще и как минимизатор квантификатора:
.*?

Результат работы примера:

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

iрегистронезависимый поиск
m

многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы «^» и «$» совпадают только с началом и концом всего текста. Когда этот параметр установлен, «^» и «$» совпадают с началом и концом отдельных строк.

sсимвол «.» (точка) совпадает и с переносом строки (по умолчанию — нет)Aпривязка к началу текстаEзаставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m.UИнвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»).eСтрока замены интерпретитуется как PHP код.

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

  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match — Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_quote — Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т.п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену
  • preg_split — Разбивает строку по регулярному выражению
preg_grep

Функция preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

array preg_grep (string pattern, array input [, int flags])

preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.

Параметр flags может принимать следующие значения:

PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:

preg_match

Функция preg_match — Выполняет проверку на соответствие регулярному выражению

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

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

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

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

Пример кода
Пример кода
Пример кода
preg_match_all

Функция preg_match_all — Выполняет глобальный поиск шаблона в строке

int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])

Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.

После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

Пример кода

Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

Пример кода

В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

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

В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

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

Пример кода
Пример кода
preg_quote

Функция preg_quote — Экранирует символы в регулярных выражениях

string preg_quote (string str [, string delimiter])

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’.

В регулярных выражениях служебными считаются следующие символы: . \ + * ? [ ^ ] $ ( ) < >= ! | :

Пример кода
Пример кода
preg_replace

Функция preg_replace — Выполняет поиск и замену по регулярному выражению

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Replacement может содержать ссылки вида \n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n’нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией $<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.

Результатом работы этого примера будет:

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

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

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

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

Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример кода: Замена по нескольким шаблонам

Этот пример выведет:

Пример кода: Использование модификатора /e
Пример кода: Преобразует все HTML-теги к верхнему регистру
preg_replace_callback

Функция preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

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

Пример кода
preg_split

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

array preg_split (string pattern, string subject [, int limit [, int flags]])

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

В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок. Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.

flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):

PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.

PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.

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

Примеры кода

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

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

Некоторые из них для наглядности будут показаны на примере языков программирования PHP или JavaScript, но в целом они работают независимо от ЯП.

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

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

Вступление

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

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

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

  • preg_match (http://php.net/manual/en/function.preg-match.php)
  • preg_match_all (http://php.net/manual/en/function.preg-match-all.php)
  • preg_replace (http://php.net/manual/en/function.preg-replace.php)

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

Функции на match возвращают число найденных подстрок или false в случае ошибок. Функция на replace возвращает измененную строку/массив или null в случае ошибки. Результат можно привести к bool (false, если не было найдено значений и true, если было) и использовать вместе с if или assertTrue для обработки результата работы.

В JS чаще всего мне приходится использовать:

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

В PHP регулярное выражение — это строка, которая начинается и заканчивается символом-разделителем. Все, что находится между разделителями и есть регулярное выражение.

Часто используемыми разделителями являются косые черты “/”, знаки решетки “#” и тильды “

”. Ниже представлены примеры шаблонов с корректными разделителями:

  • /foo bar/
  • #^[^0-9]$#
  • %[a-zA-Z0-9_-]%

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

В JavaScript регулярные выражения реализованы отдельным объектом RegExp и интегрированы в методы строк.

Создать регулярное выражение можно так:

Или более короткий вариант:

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

В этом примере мы просто ищем все символы “o”.

В PHP разница между preg_match и preg_match_all в том, что первая функция найдет только первый match и закончит поиск, в то время как вторая функция вернет все вхождения.

Пример кода на PHP:

Пробуем то же самое для второй функции:

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

Тот же пример на JavaScript:

Модификаторы шаблонов

Для регулярных выражений существует набор модификаторов, которые меняют работу поиска. Они обозначаются одиночной буквой латинского алфавита и ставятся в конце регулярного выражения, после закрывающего “/”.

  • i — символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.
  • m — по умолчанию текст обрабатывается, как однострочная символьная строка. Метасимвол начала строки ‘^’ соответствует только началу обрабатываемого текста, в то время как метасимвол конца строки ‘$’ соответствует концу текста. Если этот модификатор используется, метасимволы «начало строки» и «конец строки» также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после, как и в самом начале, и в самом конце строки.

Об остальных модификаторах, используемых в PHP, можно почитать тут.

О том, какие вообще бывают модификаторы, можно почитать тут.

Пример предыдущего регулярного выражения с модификатором на JavaScript:

Метасимволы в регулярных выражениях

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

Чаще всего мы заранее не знаем, какой текст нам придется парсить. Заранее известен только примерный набор правил. Будь то пинкод в смс, email в письме и т.п.

Первый пример, нам надо получить все числа из текста:

Чтобы выбрать любое число, надо собрать все числа, указав “[0123456789]”. Более коротко можно задать вот так: “[0-9]”. Для всех цифр существует метасимвол “d”. Он работает идентично.

Но если мы укажем регулярное выражение “/d/”, то нам вернётся только первая цифра. Мы, конечно, можем использовать модификатор “g”, но в таком случае каждая цифра вернется отдельным элементом массива, поскольку будет считаться новым вхождением.

Для того, чтобы вывести подстроку единым вхождением, существуют символы плюс “+” и звездочка “*”. Первый указывает, что нам подойдет подстрока, где есть как минимум один подходящий под набор символ. Второй — что данный набор символов может быть, а может и не быть, и это нормально. Помимо этого мы можем указать точное значение подходящих символов вот так: “”, где N — нужное количество. Или задать “от” и “до”, указав вот так: “”.

Сейчас будет пара примеров, чтобы это уложилось в голове:

Примерно так же мы работает с буквами, не забывая, что у них бывает регистр. Вот так можно задавать буквы:

  • [a-z]
  • [a-zA-Z]
  • [а-яА-Я]

C кириллицей указанный диапазон работает по-разному для разных кодировок. В юникоде, например, в этот диапазон не входит буква “ё”. Подробнее об этом тут.

Такое выражение выберет все слова, которые есть в предложении и написаны кириллицей. Нам нужно третье слово.

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

  • s — пробел
  • ^ — начало строки
  • $ — конец строки
  • | — “или”

Предыдущий пример стал проще:

Если мы точно знаем, что искомое слово последнее, мы ставим “$” и результатом работы будет только тот набор символов, после которого идет конец строки.

То же самое с началом строки:

Прежде, чем знакомиться с метасимволами дальше, надо отдельно обсудить символ “^”, потому что он у нас ходит на две работы сразу (это чтобы было интереснее). В некоторых случаях он обозначает начало строки, но в некоторых — отрицание.

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

Допустим, мы собрали набор символов, которые нам подходят: “[a-z0-9]” (нас устроит любая маленькая латинская буква или цифра). А теперь предположим, что нас устроит любой символ, кроме этого. Это будет обозначаться вот так: “[^a-z0-9]”.

Выбираем все “не пробелы”.

Итак, вот список основных метасимволов:

  • d — соответствует любой цифре; эквивалент [0-9]
  • D — соответствует любому не числовому символу; эквивалент [^0-9]
  • s — соответствует любому символу whitespace; эквивалент [

    fv]

  • S — соответствует любому не-whitespace символу; эквивалент [^

    fv]

  • w — соответствует любой букве или цифре; эквивалент [a-zA-Z0-9_]
  • W — наоборот; эквивалент [^a-zA-Z0-9_]
  • . — (просто точка) любой символ, кроме перевода “каретки”

Операторы [] и ()

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

Тут мы собрали в группу (между символами []) все латинские буквы и пробел. При помощи <> указали, что нас интересуют вхождения, где минимум 2 символа, чтобы исключить вхождения из пустых пробелов.

Аналогично мы могли бы получить все русские слова, сделав инверсию: “[^A-Za-zs]<2,>”.

В отличие от [], символы () собирают отмеченные выражения. Их иногда называют “захватом”.

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

Существует много решений. Пример ниже — это приближенный вариант, который просто покажет возможности регулярных выражений. На самом деле есть RFC, который определяет правильность email. И есть “регулярки” по RFC — вот примеры.

Мы выбираем все, что не пробел (потому что первая часть email может содержать любой набор символов), далее должен идти символ @, далее что угодно, кроме точки и пробела, далее точка, далее любой символ латиницы в нижнем регистре…

  • мы выбираем все, что не пробел: “[^s]+”
  • мы выбираем знак @: “@”
  • мы выбираем что угодно, кроме точки и пробела: “[^s.]+”
  • мы выбираем точку: “.” (обратный слеш нужен для экранирования метасимвола, так как знак точки описывает любой символ — см. выше)
  • мы выбираем любой символ латиницы в нижнем регистре: “[a-z]+”

Оказалось не так сложно. Теперь у нас есть email, собранный по частям. Рассмотрим на примере результата работы preg_match в PHP:

Получилось! Но что, если теперь нам надо по отдельности получить домен и имя по email? И как-то использовать дальше в коде? Вот тут нам поможет “захват”. Мы просто выбираем, что нам нужно, и оборачиваем знаками (), как в примере:

В массиве match нулевым элементом всегда идет полное вхождение регулярного выражения. А дальше по очереди идут “захваты”.

В PHP можно именовать “захваты”, используя следующий синтаксис:

Тогда массив матча станет ассоциативным:

Это сразу +100 к читаемости и кода, и регулярки.

Примеры из реальной жизни

Парсим письмо в поисках нового пароля:

Есть письмо с HTML-кодом, надо выдернуть из него новый пароль. Текст может быть либо на английском, либо на русском:

Сначала мы говорим, что текст перед паролем может быть двух вариантов, использовав “или”.
Вариантов можно перечислять сколько угодно:

Далее у нас знак двоеточия и один пробел:

Далее знак тега b:

А дальше нас интересует все, что не символ “ Теги:

  • regexp
  • javascript
  • junior developer
  • php

Добавить метки

Рекомендуем к прочтению

Шпаргалка по

Regex

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

Таблицы не являются исчерпывающими по двум причинам. Во-первых, все разновидности регулярных выражений различаются, и я не хотел загромождать страницу чрезмерно экзотическим синтаксисом.Чтобы получить полную информацию о конкретных вариантах регулярных выражений, которые вы будете использовать, всегда лучше сразу обратиться к источнику. Фактически, некоторые механизмы регулярных выражений (такие как Perl, PCRE, Java и .NET) вы можете проверять один раз в год, поскольку их создатели часто вводят новые функции.

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

Как пользоваться таблицами

Таблицы предназначены для использования в качестве ускоренного курса регулярных выражений и предназначены для медленного чтения, по одной строке за раз. В каждой строке в крайнем левом столбце вы найдете новый элемент синтаксиса регулярного выражения.В следующем столбце «Легенда» объясняется, что этот элемент означает (или кодирует) в синтаксисе регулярного выражения. Следующие два столбца работают рука об руку: столбец «Пример» дает допустимое регулярное выражение, в котором используется элемент, а столбец «Образец соответствия» представляет текстовую строку, которая может быть сопоставлена ​​регулярным выражением.

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

Наслаждайтесь!

Если вы передозируете, не пропустите следующую страницу, которая возвращается на Землю и рассказывает о некоторых действительно интересных вещах: 1001 способ использования Regex .

Ускоренный курс по регулярным выражениям и шпаргалка

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

✽ Персонажи
✽ Кванторы
✽ Больше персонажей
✽ Логика
✽ Подробнее White-Space
✽ Больше квантификаторов
✽ Классы персонажей
✽ Якоря и границы
✽ Классы POSIX
✽ Встроенные модификаторы
✽ Обзоры
✽ Операции класса персонажей
✽ Другой синтаксис

(прямая ссылка)

Персонажи

Символ Легенда Пример Пример совпадения
\ d Большинство двигателей: одна цифра
от 0 до 9
file_ \ d \ d file_25
\ d .NET, Python 3: одна цифра Unicode в любом скрипте file_ \ d \ d file_9੩
\ w Большинство движков: «символ слова»: буква ASCII, цифра или символ подчеркивания \ w- \ w \ w \ w A-b_1
\ w .Python 3: «символ слова»: буква Юникода, идеограмма, цифра или символ подчеркивания \ w- \ w \ w \ w 字 -ま _۳
\ w .NET: «словесный символ»: буква Юникода, идеограмма, цифра или соединитель \ w- \ w \ w \ w 字 — ま ‿۳
\ s Большинство движков: «пробельный символ»: пробел, табуляция, новая строка, возврат каретки, вертикальная табуляция a \ sb \ sc ab
c
\ s.NET, Python 3, JavaScript: «пробельный символ»: любой разделитель Unicode a \ sb \ sc ab
c
\ D Один символ, который не является цифрой , как определено в вашего движка \ d \ D \ D \ D ABC
\ W Один символ, который не является символом слова , как определено в \ w \ W \ W \ W \ W \ W * — + =)
\ S Один символ, который не является пробельным символом , как определено в вашем движке \ s \ S \ S \ S \ S Yoyo

(прямая ссылка)

Квантификаторы

Квантификатор Легенда Пример Выборочное соответствие
+ Один или несколько Версия \ w- \ w + Версия A-b1_1
{3} Ровно три раза \ D {3} ABC
{2,4} От двух до четырех раз \ d {2,4} 156
{3,} Три или более раз \ w {3,} regex_tutorial
* Ноль или более раз A * B * C * AAACC
? Один раз или нет во множественном числе? множественное число

(прямая ссылка)

Еще персонажи

Символ Легенда Пример Пример совпадения
./ \
\ Экранирует специальный символ \ [\ {\ (\) \} \] [{()}]

(прямая ссылка)

Логика

Логика Легенда Пример Пример совпадения
| Чередование / операнд ИЛИ 22 | 33 33
(…) Группа захвата A (nt | pple) Apple (захватывает «pple»)
\ 1 Содержимое группы 1 r (\ w) g \ 1x регулярное выражение
\ 2 Содержимое группы 2 (\ d \ d) \ + (\ d \ d) = \ 2 \ + \ 1 12 + 65 = 65 + 12
(?:…) Группа без захвата A (?: Nt | pple) Apple

(прямая ссылка)

Подробнее White-Space

Символ Легенда Пример Пример соответствия
\ t Tab T \ t \ w {2} T ab
\ r Символ возврата каретки см. ниже
\ n Символ перевода строки см. ниже
\ r \ n Разделитель строк в Windows AB \ r \ nCD AB
CD
\ N Perl, PCRE (C, PHP, R…): один символ, не являющийся разрывом строки \ N + ABC
\ h Perl, PCRE (C, PHP, R…), Java: один горизонтальный пробельный символ: табуляция или разделитель пробелов Unicode
\ H Один символ, не являющийся горизонтальным пробелом
\ v.NET, JavaScript, Python, Ruby: вертикальная табуляция
\ v Perl, PCRE (C, PHP, R…), Java: один вертикальный пробел: перевод строки, возврат каретки, вертикальная табуляция, подача формы , разделитель абзацев или строк
\ V Perl, PCRE (C, PHP, R…), Java: любой символ, кроме вертикального пробела
\ R Perl, PCRE (C, PHP, R…), Java: один разрыв строки (пара возврата каретки + перевода строки и все символы, соответствующие \ v)

(прямая ссылка)

Другие квантификаторы

Квантификатор Легенда Пример Выборочное соответствие
+ Знак + (один или несколько) «жадный» \ d + 12345
? Делает кванторы «ленивыми» \ d +? 1 дюйм 1 2345
* Знак * (ноль или более) означает «жадный» A * AAA
? Делает кванторы «ленивыми» A *? пустой в AAA
{2,4} Два-четыре раза, «жадный» \ w {2,4} abcd
? Делает кванторы «ленивыми» \ w {2,4}? ab в ab cd

(прямая ссылка)

Классы символов

Символ Обозначение Пример Пример соответствия
[…] Один из символов в скобках [AEIOU] Один гласный в верхнем регистре
[…] Один символов в скобках T [ao] p Tap или Top
Индикатор диапазона [az] Одна строчная буква
[xy] Один из символов в диапазоне от x до y [AZ] + GREAT
[…] Один из символов в скобках [AB1-5w-z] Один из любого : A, B, 1,2,3,4,5, w, x, y, z
[xy] Один из символов в диапазоне от x до y [- ~] + Символы в печатаемом разделе таблицы ASCII.- ~] + Символы, которые являются , а не в печатаемой части таблицы ASCII.
[\ d \ D] Один символ, который является цифрой или не является цифрой [\ d \ D] + Любые символы, включая
, включая новые строки, которых нет в обычной точке. t соответствует
[\ x41] Соответствует символу в шестнадцатеричной позиции 41 в таблице ASCII, то есть A [\ x41- \ x45] {3} ABE

(прямая ссылка)

Якорь Легенда Пример Пример совпадения
^ Начало строки или начало строки в зависимости от многострочного режима.abc. * abc (начало строки)
$ Конец строки или конец строки в зависимости от многострочного режима. Многие зависящие от двигателя тонкости.. *? конец $ это конец
\ A Начало строки
(все основные движки, кроме JS)
\ Aabc [\ d \ D] * abc (строка …
.. .start)
\ z Самый конец строки
Недоступно в Python и JS
конец \ z это есть… \ n … конец
\ Z Конец строки или (кроме Python) перед окончательным разрывом строки
Недоступно в JS
конец \ Z это … \ n … конец \ n
\ G Начало строки или конец предыдущего совпадения
.NET, Java, PCRE (C, PHP, R…), Perl, Ruby
\ b Граница слова
Большинство механизмов: позиция, где только одна сторона представляет собой букву ASCII, цифру или знак подчеркивания
Боб .* \ bcat \ b Боб съел кошку
\ b Граница слова
.NET, Java, Python 3, Ruby: позиция, в которой только одна сторона представляет собой букву, цифру или знак подчеркивания Unicode
Боб. * \ b \ кошка \ b Боб съел кошку
\ B Не граница слова c. * \ Bcat \ B. * copycats

(прямая ссылка)

Классы POSIX

Символ Легенда Пример Пример совпадения
[: alpha:] PCRE (C, PHP, R…): буквы ASCII AZ и az [8 [: alpha:]] + WellDone88
[: alpha:] Ruby 2: буква Unicode или идеограмма [[: alpha:] \ d] + кошка99
[: alnum:] PCRE ( C, PHP, R…): цифры и буквы ASCII AZ и az [[: alnum:]] {10} ABCDE12345
[: alnum:] Ruby 2: цифра, буква или идеограмма Unicode [[: alnum:]] {10} кошка
[: punct:] PCRE (C, PHP, R…): знак препинания ASCII [[: punct:]] +?!.,:;
[: punct:] Ruby: знак препинания Unicode [[: punct:]] +‽,: 〽⁆

(прямая ссылка)

Ни один из них не поддерживается в JavaScript. В Ruby остерегайтесь (? S) и (? M).

Модификатор Легенда Пример Выборочное соответствие
(? I) Режим без учета регистра
(кроме JavaScript)
(? i) понедельник понедельник
(? s) DOTALL режим (кроме JS и Ruby).3 $ 1
2
3
(? M) В Ruby: то же, что и (? S) в других движках, т.е. режим DOTALL, т.е. точка соответствует разрывам строки (? M) От A . * до Z От A
до Z
(? x) Режим свободного интервала
(кроме JavaScript). Также известен как режим комментариев или режим пробелов
(? X) # это
# комментарий
abc # запись на нескольких
# строках
[] d # пробелы должны быть
# в скобках
abc d
(? п).) PCRE 10.32+: сбросить модификаторы Убрать модификаторы ismnx

(прямая ссылка)

(прямая ссылка)

Class Operation Legend Example Sample Match
[… — […]] .NET: вычитание класса символов. Один символ, который находится в тех, которые находятся слева, но не в вычитаемом классе. [a-z- [aeiou]] Любой согласный в нижнем регистре
[… — […]].NET: вычитание класса символов. [\ p {IsArabic} — [\ D]] Арабский символ, который не является нецифровым, например арабская цифра
[… && […]] Java, Ruby 2+ : пересечение классов символов. Один символ, который есть как слева, так и в классе &&. [\ S && [\ D]] Непробельный символ, не являющийся цифрой.
[… && […]] Java, Ruby 2+: пересечение символьных классов.\ p {L} \ p {N}]] Арабский символ, не являющийся буквой или числом

(прямая ссылка)

Другой синтаксис

Синтаксис Легенда Пример Пример совпадения
\ K Не пропускать
Perl, PCRE (C, PHP, R…), альтернативный механизм Python regex , Ruby 2+: отбросьте все, что было найдено до сих пор из общего совпадения, чтобы вернуть префикс
\ K \ d + 12
\ Q… \ E Perl, PCRE (C, PHP, R…), Java: рассматривать все, что находится между разделителями, как буквальную строку.Полезно для экранирования метасимволов. \ Q (C ++?) \ E (C ++?)

1001 способ использования Regex

.

Регулярные выражения — шпаргалка

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

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

Основные метасимволы
.]
Диапазон. Соответствует любому символу, не входящему в их число.
\ (обратная косая черта)
Побег. Удаление или добавление особого значения символу.
Множители
*
Совпадает ноль или более раз.
+
Соответствует один или несколько раз.
?
Совпадает ноль или один раз.
{x}
Совпадение ровно x раз.
{x, y}
Совпадение от x до y раз.
{x,}
Совпадение не менее x раз.
Сокращенные классы символов
\ с
Все, что считается пробелом.
\ S
Все, что не считается пробелом.
\ д
Цифра (например, 0–9)
\ D
Все, что не является цифрой.
Начало строки.
$
Конец строки.
\ <
Начало слова.
\>
Конец слова.
\ б
Начало или конец слова.
Группировка и обратные ссылки
Можно использовать где угодно на любом пути.
()
Создать группировку.
\ x (x = цифра)
Соответствует тому, что было найдено в соответствующей группе.
Чередование
|
Сопоставьте то, что находится слева или справа от символа трубы.
Просмотр вперед и назад
(? = Х)
Позитивный взгляд в будущее.
(?! X)
Отрицательный взгляд вперед.
(? <= X)
Позитивный взгляд назад.
(?
Отрицательный взгляд назад.

.

Строка соответствия, не содержащая строки

Классы символов
. любой символ, кроме новой строки
\ ш \ д \ с слово, цифра, пробел
\ W \ D \ S не слово, цифра, пробел
[abc] любой из a, b или c
[^ abc] не a, b или c
[а-г] символ между a и g
Анкеры
^ abc $ начало / конец строки
\ б граница слова
Экранированные символы
\.\ * \\ экранированных специальных символов
\ t \ n \ r табуляция, перевод строки, возврат каретки
\ u00A9 Unicode сброшен ©
Группы и поиск
(abc) группа захвата
\ 1 обратная ссылка на группу № 1
(?: Abc) группа без захвата
(? = Abc) положительный прогноз
(?! Abc) негативный прогноз
Квантификаторы и чередование
а * а + а? 0 или более, 1 или более, 0 или 1
а {5} а {2,} ровно пять, два или больше
а {1,3} между одним и тремя
а +? а {2,}? совпадений как можно меньше
ab | cd соответствует ab или cd

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *