Главная > PHP

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

27 января 2010 | Просмотров: 10334

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

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

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

Таблица 1 – Метасимволы регулярных выражений
Метасимвол Описание
. Соответствует любому одному символу
[…] Соответствует одному символу из тех, что перечислены в квадратных скобках, например, выражение [0123456789] соответствует одной цифре, выражение может быть свернуто в последовательность [0-9]
[^…] Соответствует одному любому символу, не перечисленному в квадратных скобках, например, выражение [^0-9] соответствует любому символу, не являющемуся цифрой
^ Позиция в начале строки, например, выражение ^flag соответствует любой строке, начинающейся со слова flag
$ Позиция в конце строки, например, выражение ^fl$ соответствует строке, содержащей лишь два символа fl, а строке flag регулярное выражение уже не будет соответствовать
| Любое из разделяемых выражений, например, выражение first|second соответствует любой строке, содержащей либо слово first, либо слово second
(…) Круглые скобки служат для логического объединения частей регулярного выражения

Если искомая строка сама содержит метасимволы, их следует экранировать. Например, для поиска подстроки "ссылка [9]", где вместо цифры 9 может стоять любая другая цифра, может использоваться регулярное выражение:

"ссылка \[[0-9]\]"

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

Квантификаторы регулярных выражений

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

"ссылка \[[0-9]+\]"

Таблица 2 – Квантификаторы регулярных выражений
Квантификатор Описание
? Предшествующий символ либо входит в строку один раз, либо вообще в нее не входит
* Предшествующий символ входит в строку любое число раз, в том числе и 0
+ Предшествующий символ входит в строку один и более число раз
{n} Предшествующий символ входит в строку n раз
{n,} Предшествующий символ входит в строку n и более количество раз
{n, m} Предшествующий символ входит в строку от n до m раз

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

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

Помимо метасимволов и квантификаторов, специальным значением обладает ряд экранированных обратным слэшем символов (таблица 3).

Таблица 3 – Специальные символы регулярных выражений
Специальный символ Описание
\b Позиция, соответствующая границе слова
\B Позиция, не соответствующая границе слова
\n Соответствует символу новой строки
\r Соответствует символу возврата каретки
\t Соответствует символу табуляции
\f Соответствует символу конца файла
\d Соответствует любой десятичной цифре, является аналогом символьного класса [0-9]
\D Соответствует любому символу, кроме десятичной цифры, является аналогом символьного класса [^0-9]
\w Соответствует любому алфавитно-цифровому символу и символу подчеркивания, т.е. символ, образующий "слово". Является аналогом символьного класса [a-zA-Z0-9_]
\W Соответствует всем символам, которые не попадают под определение метасимвола \w
\s Соответствует любому пробельному символу
\S Соответствует любому не пробельному символу

Позиционные проверки

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

Таблица 4 – Позиционные проверки регулярных выражений
Позиционная проверка Описание
(?<=…) Выражение в скобках … располагается слева
(?<!...) Выражение в скобках … не может располагаться слева
(?=…) Выражение в скобках … располагается справа
(?!...) Выражение в скобках … не может располагаться справа

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

В Perl-регулярных выражениях само выражение заключается в граничные символы, после которого могут следовать модификаторы регулярного выражения. Рассмотрим три выражения для поиска подстроки "flag":

/flag/i

#flag#is

|flag|

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

Если прямая черта (|) выступает в качестве границы регулярного выражения, она не может использоваться внутри выражения как метасимвол, так как граничные символы придется экранировать, что снимает их специальное значение.
Таблица 5 – Модификаторы Perl-регулярных выражений
Модификатор Описание
i Регулярное выражение не зависит от регистра
m Если используется данный модификатор, то соответствие ищется в интервале между двумя переводами строк, а не во всем тексте
s Если используется данный модификатор, то соответствие ищется во всем тексте, а не в интервале между двумя переводами строк
x При использовании данного модификатора неэкранируемые пробелы и символы табуляции игнорируются, если они находятся вне квадратных скобок
e При использовании данного модификатора в функции preg_replace() после стандартных подстановок в заменяемой строке последняя интерпретируется как PHP-код, результат которого используется для замены искомой строки
U При использовании данного модификатора ищется минимальное по длине соответствие регулярному выражению (без использования данного модификатора ищется максимальное соответствие)

Чтобы оставить коментарий Вы должны зарегистрироваться, или войти, если Вы уже зарегистрированы

Комментариев (0)