Регулярные выражения PHP
Что такое регулярное выражение?
Регулярные выражения в PHP (с англ. RegEx или regex) представляют собой последовательность символов, описывающих специальные шаблоны, которые применяются для различных вариантов обработки текста: проверки, поиска и замены того или иного фрагмента, состоящего из букв, цифр или любых других символов, в том числе специальных символов и символов пунктуации.
Синтаксис регулярных выражений
Регулярное выражение представляет собой строку, которая всегда начинается с символа разделителя, за ним следует шаблон регулярного выражения, затем еще один символ разделителя и, наконец, необязятельный список модификаторов.
$exp = "/wm-school/i";
В приведенном выше примере, в качестве символа разделителя используется слэш /
, wm-school — это шаблон, по которому идет поиск, а символ i
, расположенный после второго разделителя — это модификатор, позволяющий вести поиск без учета регистра.
В качестве символа разделителя может быть любой символ, кроме буквы, цифры, обратной косой черты \
или пробела. Самый распространенный разделитель — это слэш /
, но если ваш шаблон содержит слэш, удобно выбрать другие разделители, такие как #
или ~
.
Функции регулярных выражений
PHP предоставляет программистам множество полезных функций, позволяющих использовать регулярные выражения. Рассмотрим некоторые функции, которые являются одними из наиболее часто используемых:
Функция | Определение |
---|---|
preg_match() | Эта функция ищет конкретный образец в некоторой строке. Он возвращает 1 (true), если шаблон существует, и 0 (false) в противном случае. |
preg_match_all() | Эта функция ищет все вхождения шаблона в строке. Она возвращает количество найденных совпадений с шаблоном в строке, или 0 — если вхождений нет. Функция удобна для поиска и замены. |
ereg_replace() | Эта функция ищет определенный шаблон строки и возвращает новую строку, в которой совпадающие шаблоны были заменены другой строкой. |
eregi_replace() | Функция ведет себя как ereg_replace() при условии, что поиск шаблона не чувствителен к регистру. |
preg_replace() | Эта функция ведет себя как функция ereg_replace() при условии, что регулярные выражения могут использоваться как в шаблоне так и в строках замены. |
preg_split() | Функция ведет себя как функция PHP split(). Он разбивает строку на регулярные выражения в качестве параметров. |
preg_grep() | Эта функция ищет все элементы, которые соответствуют шаблону регулярного выражения, и возвращает выходной массив. |
preg_quote() | Эта функция принимает строку и кавычки перед каждым символом, который соответствует регулярному выражению. |
ereg() | Эта функция ищет строку, заданную шаблоном, и возвращает TRUE, если она найдена, иначе возвращает FALSE. |
eregi() | Эта функция ведет себя как функция ereg() при условии, что поиск не чувствителен к регистру. |
Примечание:
- По умолчанию регулярные выражения чувствительны к регистру.
- В PHP есть разница между строками внутри одинарных кавычек и строками внутри двойных кавычек. Первые обрабатываются буквально, тогда как для строк внутри двойных кавычек печатается содержимое переменных, а не просто выводятся их имена.
Функция preg_match()
Функция preg_match()
выполняет проверку на соответствие регулярному выражению.
Пример. Поиск подстроки "php" в строке без учета регистра:
Пример
Попробуй сам »<?php
$str = "PHP - это язык веб-сценариев.";
$pattern = "/php/i";
if (preg_match($pattern, $str)) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}
Результат выполнения кода:
В примере выше символ "i" после закрывающего ограничителя шаблона означает регистронезависимый поиск, поэтому вхождение будет найдено.
Примечание: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Для этого используйте strpos() или strstr(), т.к. они выполнят эту задачу гораздо быстрее.
Функция preg_match_all()
Функция preg_match_all()
выполняет глобальный поиск шаблона в строке.
В примере регулярное выражение используется для подсчета числа вхождений «ain» в строку без учета регистра:
Пример
Попробуй сам »<?php
$str = "The rain in England falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);
?>
Результат выполнения кода:
Функция preg_replace()
Функция preg_replace()
выполняет поиск и замену по регулярному выражению.
В следующем функция выполняет поиск в строке совпадений с шаблоном pattern и заменяет их на replacement:
Пример
Попробуй сам »<?php
$string = "Выпускной вечер в 2021 г";
$pattern = "/2021/i";
$replacement = "2022";
echo preg_replace($pattern, $replacement, $string);
?>
Результат выполнения кода:
Модификаторы регулярных выражений
Модификаторы указываются либо в скобках, например так: (?Ui), либо после закрывающего символа '/pattern/Ui'.
Модификатор | Описание |
---|---|
i | Выполняет поиск без учета регистра. Например "/a/i" ищет и a, и A. |
m | Выполняет многострочный поиск (шаблоны, которые ищут начало или конец строки, будут соответствовать началу или концу каждой строки) |
u | Обеспечивает правильное сопоставление шаблонов в кодировке UTF-8 (для поиска русского текста например). |
U | Инвертирует "жадность" (по умолчанию жадный, т.е. пытается захватить как можно большую строку, подходящую по условию). |
s | Если используется, то символ точка (.) соответствует и переводу строки. Иначе она ему не соответствует. |
x | Игнорировать пробелы. В этом случае пробелы нужно экранировать обратным слэшем \. |
При использовании модификаторов, можно использовать знак минус (-)
для отключения модификатора. Например:
Шаблоны регулярных выражений
Квадратные скобки[b-d0-4xyz]
означают, что нужно выбрать «один из этих символов», в данном случае - буквы b
, c
, d
, x
, y
, z
или цифра от 0
до 4
. Внутри квадратных скобок ()
не работают другие спецсимволы например |
или *
- они обозначают обычный символ. Если в квадратных скобках в начале стоит символ ^
то смысл меняется на противоположный: «любой один символ, кроме указанных» например, [^b-d]
значит «один любой символ, кроме b
, c
или d
».
Квадратные скобки ([]) используются для нахождения ряда символов:
Выражение | Описание |
---|---|
[abc] | Один из символов a, b, c |
[^abc] | Любой символ кроме a, b, c |
[0-9] | Любой символ из диапазона от 0 до 9 |
[a-zА-Я] | Любой символ из диапазонов |
Примечание: в квадратных скобках можно указывать диапазоны символов, но следует помнить, что русская буква ё
идет отдельно от алфавита и для создания регулярки «любая русская буква» нужно писать [а-яё]
.
Метасимволы
В регулярных выражениях используются два типа символов: обычные символы и метасимволы. Обычные символы - это те символы, которые имеют «буквальное» значение, а метасимволы - это те символы, которые имеют «особое» значение в регулярном выражении.
Преимуществом регулярных выражений является возможность использовать условия и повторения в шаблоне. Выражения записываются при помощи метасимволов, которые специальным образом интерпретируются. Метасимвол отличается от любого другого символа тем, что имеет специальное значение.
Одним из основных метасимволов является обратный слэш (\), который меняет тип символа, следующего за ним, на противоположный. Таким образом обычный символ можно превратить в метасимвол, а если это был метасимвол, то он теряет свое специальное значение и становится обычным символом. Этот приём нужен для того, чтобы вставлять в текст специальные символы как обычные. Например, символ d
в обычном режиме не имеет никаких специальных значений, но \d
— это уже метасимвол, который обозначает: «любая цифра». Символ точка (.)
в обычном режиме значит — «любой единичный символ», а экранированная точка (\.) означает просто точку.
Метасимвол | Описание | пример |
---|---|---|
. | Соответствует любому одиночному символу, кроме новой строки. | /./ соответствует строке, состоящей из одного символа. |
^ | Соответствует началу строки. | /^cars/ соответствует любой строке, которая начинается с cars. |
$ | Соответствует шаблону в конце строки. | /com$/ соответствует строке, заканчивающейся на com, например gmail.com |
* | Соответствует 0 или более вхождений. | /com*/ соответствует commute, computer, compromise и т.д. |
+ | Соответствующий предыдущему символу появляется как минимум один раз. | Например, /z+oom/ соответствует zoom. |
\ | Используется для удаления метасимволов в регулярном выражении. | /google\.com/ будет рассматривать точку как буквальное значение, а не как метасимвол. |
a-z | Соответствует строчным буквам. | cars |
A-Z | Соответствует буквам в верхнем регистре. | CARS |
0-9 | Соответствует любому числу от 0 до 9. | /0-5/ соответствует 0, 1, 2, 3, 4, 5 |
[…] | Соответствует классу символов. | /[pqr]/ соответствует pqr |
| | Разделяет перечисление альтернативных вариантов. | /(cat|dog|fish)/ соответствует cat или dog или fish |
\d | Любая цифра. | /(\d)/ соответствует цифре |
\s | Найти пробельный символ (в т.ч. табуляция). | /(\s)/ соответствует пробелу |
\b | Граница слова (начало или конец). | /\bWORD/ найти совпадение в начале слова |
Повторения (квантификаторы)
Комбинация типа \d\d
означает, что цифра должна повторяться два раза. Но бывают задачи, когда повторений очень много или мы не знаем, сколько именно. В таких члучаях нужно использовать специальные метасимволы.
Повторения символов или комбинаций описываются с помощью квантификаторов (метасимволов, которые задают количественные отношения). Есть два типа квантификаторов: общие (задаются с помощью фигурных скобок {}
) и сокращенные (сокращения наиболее распространенных квантификаторов). Фигурные скобки x{1,7}
задают число повторений предыдущего символа (в этом случае выражение ищет от 1 до 7 идущих подряд букв «x»).
Квантификатор | Описанте |
---|---|
a+ | Один и более раз a |
a* | Ноль и более раз a |
a? | Одна a или пусто |
a{3} | 3 раза a |
a{3,5} | От 3 до 5 раз a |
a{3,} | 3 и более раз a |
Примечание: Если в выражении требуется поиск одного из метасимволов, вы можете использовать обратный слэш (\)
. Например, для поиска одного или нескольких вопросительных знаков (?)
можно использовать следующее выражение: $pattern = '/\?+/';
Группировка
Группы (подмаски) в регулярных выражениях делаются с помощью метасимвола группировки ()
.
Например в выражении xyz+ знак плюс (+)
относится только к букве z
и это выражение ищет слова типа xyz
, xyzz
, xyzzz
. Но если поставить скобки x(yz)+
то квантифиактор (+)
относится уже к последовательности yz
и регулярка ищет слова xyz
, xyzyz
, xyzyzyz
.
Пример
Попробуй сам »<?php
$str = "Hello, boy Bananan!";
$pattern = "/Ba(na){2}n/";
echo preg_match($pattern, $str);
?>
Результат выполнения кода:
Ещё примеры:
Выражение | Описание |
---|---|
^[a-zA-Z0-9_]{1,}$ | Любое слово, хотя бы одна буква, число или _ |
+@[a-z0-9A-Z] | Соответствует строке с символом @ в начале, за которым следует любая буква нижнего регистра, число от 0 до 9 или буква верхнего регистра. |
([wx])([yz]) | wy, wz, xy, или xz |
[a-z]+ | Один или более символов нижнего регистра |
Практические упражнения по регулярным выражениям PHP.