Регулярные выражения представляют собой специализированный мини-язык, предназначенный для поиска в строках по шаблону. PHP поддерживает два стиля синтаксиса регулярных выражений: POSIX и Perl. Для PHP пятой версии стиль POSIX регулярных выражений встроен по умолчанию. Но начиная с шестой версии, регулярные выражения POSIX будут исключены из ядра PHP. Поэтому будем рассматривать синтаксис Perl-регулярных выражений.
Метасимволы регулярных выражений
Шаблон, формируемый при помощи регулярных выражений, может состоять как из обычных символов, так и метасимволов. В таблице 1 приводятся наиболее распространенные метасимволы.
| Метасимвол | Описание |
|---|---|
| . | Соответствует любому одному символу |
| […] | Соответствует одному символу из тех, что перечислены в квадратных скобках, например, выражение [0123456789] соответствует одной цифре, выражение может быть свернуто в последовательность [0-9] |
| [^…] | Соответствует одному любому символу, не перечисленному в квадратных скобках, например, выражение [^0-9] соответствует любому символу, не являющемуся цифрой |
| ^ | Позиция в начале строки, например, выражение ^flag соответствует любой строке, начинающейся со слова flag |
| $ | Позиция в конце строки, например, выражение ^fl$ соответствует строке, содержащей лишь два символа fl, а строке flag регулярное выражение уже не будет соответствовать |
| | | Любое из разделяемых выражений, например, выражение first|second соответствует любой строке, содержащей либо слово first, либо слово second |
| (…) | Круглые скобки служат для логического объединения частей регулярного выражения |
Если искомая строка сама содержит метасимволы, их следует экранировать. Например, для поиска подстроки "ссылка [9]", где вместо цифры 9 может стоять любая другая цифра, может использоваться регулярное выражение:
"ссылка \[[0-9]\]"
Таким образом, для поиска квадратных скобок их необходимо экранировать, чтобы интерпретатор регулярных выражений не воспринимал их как начало символьного класса.
Квантификаторы регулярных выражений
Символ точки, а также квадратные скобки всегда обозначают лишь один символ. Однако в приведенном выше примере ссылка может состоять из одной и более цифр. Для решения этой задачи используются квантификаторы (таблица 2), которые позволяют задать количество повторений символа. Таким образом, приведенное выше регулярное выражение можно обобщить на произвольное количество цифр в квадратных скобках:
"ссылка \[[0-9]+\]"
| Квантификатор | Описание |
|---|---|
| ? | Предшествующий символ либо входит в строку один раз, либо вообще в нее не входит |
| * | Предшествующий символ входит в строку любое число раз, в том числе и 0 |
| + | Предшествующий символ входит в строку один и более число раз |
| {n} | Предшествующий символ входит в строку n раз |
| {n,} | Предшествующий символ входит в строку n и более количество раз |
| {n, m} | Предшествующий символ входит в строку от n до m раз |
Знак вопроса, стоящий после последовательностей .* и .+, имеет специальное значение. Обычно регулярные выражения стремятся найти как можно более длинное соответствие, в связи с чем указанные выше последовательности стремятся вернуть всю строку. Однако такое поведение можно изменить, воспользовавшись последовательностями .*? или .+?, которые стремятся найти как можно более короткое соответствие.
Специальные символы
Помимо метасимволов и квантификаторов, специальным значением обладает ряд экранированных обратным слэшем символов (таблица 3).
| Специальный символ | Описание |
|---|---|
| \b | Позиция, соответствующая границе слова |
| \B | Позиция, не соответствующая границе слова |
| \n | Соответствует символу новой строки |
| \r | Соответствует символу возврата каретки |
| \t | Соответствует символу табуляции |
| \f | Соответствует символу конца файла |
| \d | Соответствует любой десятичной цифре, является аналогом символьного класса [0-9] |
| \D | Соответствует любому символу, кроме десятичной цифры, является аналогом символьного класса [^0-9] |
| \w | Соответствует любому алфавитно-цифровому символу и символу подчеркивания, т.е. символ, образующий "слово". Является аналогом символьного класса [a-zA-Z0-9_] |
| \W | Соответствует всем символам, которые не попадают под определение метасимвола \w |
| \s | Соответствует любому пробельному символу |
| \S | Соответствует любому не пробельному символу |
Позиционные проверки
Помимо обычных круглых скобок, диалект Perl-регулярных выражений предоставляет разработчику четыре типа позиционных проверок (таблица 4), позволяющих выяснить, находится та или иная подстрока справа или слева от текущей позиции.
| Позиционная проверка | Описание |
|---|---|
| (?<=…) | Выражение в скобках … располагается слева |
| (?<!...) | Выражение в скобках … не может располагаться слева |
| (?=…) | Выражение в скобках … располагается справа |
| (?!...) | Выражение в скобках … не может располагаться справа |
Модификаторы
В Perl-регулярных выражениях само выражение заключается в граничные символы, после которого могут следовать модификаторы регулярного выражения. Рассмотрим три выражения для поиска подстроки "flag":
/flag/i
#flag#is
|flag|
В первом случае в качестве граничных символов выступает прямой слэш (/), во втором – символ диеза (#), в последнем случае – прямая черта (|). Символы, расположенные после закрывающего граничного символа, являются модификаторами. Список модификаторов приводится в таблице 5.
| Модификатор | Описание |
|---|---|
| i | Регулярное выражение не зависит от регистра |
| m | Если используется данный модификатор, то соответствие ищется в интервале между двумя переводами строк, а не во всем тексте |
| s | Если используется данный модификатор, то соответствие ищется во всем тексте, а не в интервале между двумя переводами строк |
| x | При использовании данного модификатора неэкранируемые пробелы и символы табуляции игнорируются, если они находятся вне квадратных скобок |
| e | При использовании данного модификатора в функции preg_replace() после стандартных подстановок в заменяемой строке последняя интерпретируется как PHP-код, результат которого используется для замены искомой строки |
| U | При использовании данного модификатора ищется минимальное по длине соответствие регулярному выражению (без использования данного модификатора ищется максимальное соответствие) |