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

РНР поддерживает два стиля синтаксиса регулярных выражений: POSIX и Perl. Стиль POSIX регулярных выражений компилируется в РНР по умолчанию, а стиль Perl можно активизировать, выполнив компиляцию с библиотекой PCRE (Perl-compatible regular expression — Perl-совместимые регулярные выражения). Мы рассмотрим более простой стиль POSIX.

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

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

В дополнение к точному сопоставлению символов можно использовать специальные символы для указания метазначений.

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

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

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

Прежде всего, символ "." можно использовать в качестве группового символа для любого другого одиночного символа, за исключением символа новой строки (\п). Например, регулярное выражение:

.at

соответствует, в частности, строкам "cat", "sat" и "mat".

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

Однако, используя регулярные выражения, можно точнее указывать тип символов, которые нужно сопоставить, и можно действительно указывать набор, к которому должен принадлежать символ. В предыдущем примере регулярное выражение соответствует строкам "mat" и "cat", но оно соответствует также и строке "#at". Если соответствие необходимо ограничить символами от а до z, его можно указать следующим образом:

[a-z] at

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

Набор можно указать в виде списка. Например:

[aeiou]

означает любую гласную английского алфавита.

Можно описать также диапазон, как это было только что сделано с помощью символа дефиса, или набор диапазонов:

[a-z A-Z]

Этот набор диапазонов означает любой строчный или прописной символ английского алфавита.

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

[^a-z]

соответствует любому символу, не относящемуся к диапазону a-z. Когда он помещен внутрь квадратных скобок, символ вставки А означает "не". При использовании вне квадратных скобок он имеет другое значение, что будет рассмотрено дальше.

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

Таблица. Классы символов, используемые в регулярных выражениях стиля POSIX

Класс Соответствие
[ [:alnun:] ] Алфавитно-цифровые символы
[ [alpha:] ] Буквенные символы
[ [:lower:] ] Строчные буквы
[ [:upper:] ] Прописные буквы
[ [:digit:] ] Десятичные цифры
[ [:xdigit:] ] Шестнадцатитеричные цифры
[ [:punct:] ] Знаки пунктуации
[ [:blanc:] ] Символы табуляции и пробелов
[ [:space:] ] Любые пробельные символы
[ [:cntrl:] ] Управляющие символы
[ [:print:] ] Все печатные символы
[ [:graph:] ] Все печатные символы, за исключением пробельных

Повторение

Часто требуется указать возможность наличия нескольких вхождений конкретной строки или класса символов. В регулярном выражении это можно сделать с помощью двух специальных символов. Символ * означает, что шаблон может повторяться нуль или более раз, а символ + — 1 или более раз. Эти символы должны указываться непосредственно после той части выражения, к которой они применяются. Например:

[ [:alnum:] ]+

означает "по крайней мере один алфавитно-цифровой символ".

Подвыражения

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

(very )*large

соответствует строкам "large", "very large", "very very large" и т.д.

Подвыражения с подсчетом

Количество повторений какой-либо строки можно указать с помощью числового выражения, заключенного в фигурные скобки ({}). При этом можно указывать точное число повторений ({3} означает в точности 3 повторения), диапазон повторений ({2, 4} означает от 2 до 4 повторений) или открытый диапазон повторений ({2,} означает не менее двух повторений).

(very ){1, 3}

соответствует строкам "very", "very very" и "very very very".

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

Шаблон [a-z] будет соответствовать любой строке, содержащей строчную букву английского алфавита. При этом неважно, имеетли строка длину в один символ, либо совпадение произошло с одним символом в длинной строке.

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

Символ вставки (^) используется в начале регулярного выражения для указания того, что оно должно присутствовать в начале просматриваемой строки, а символ $ используется в конце регулярного выражения для указания того, что оно должно присутствовать в конце строки.

Например, наличию подстроки abc в начале просматриваемой строки соответствует следующее выражение:

^abc

Наличию подстроки com в конце просматриваемой строки соответствует такое выражение:

com$

И, наконец, любому одиночному символу от a до z, расположенному в отдельной строке, соответствует приведенное ниже выражение:

^[a-z]$

Ветвление

Выбор в регулярном выражении можно представить с помощью символа вертикальной черты (|). Например, если требуется сопоставить строку com, edu или net, можно воспользоваться выражением:

(com) | (edu) | (net)

Сопоставление с литеральными значениями специальных символов

Если нужно сопоставить Один из специальных символов, упомянутых в этом разделе, таких как ., { или $, перед ним необходимо поместить символ косой черты (\). Если нужно представить символ косой черты, его следует заменить двумя символами косой черты, т.е. \\.

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

Аналогично, если требуется указать косую черту в РНР-строке в двойных кавычках, косых черт должно быть две, по тем же самым причинам. Тот факт, что в результате применения этих правил РНР-строка, представляющая регулярное выражение с литеральной чертой, должна содержать четыре косых черты, многих сбивает с толку. Интерпретатор РНР преобразует четыре косых черты в две, а затем интерпретатор регулярных выражений преобразует две косых черты в одну.

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

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

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

Символ Значение
\ Символ отмены специального символа
^ Соответствие в начале строки
$ Соответствие в конце строки
. Соответствие любому символу, за исключением символа новой строки (\n)
| Начало альтернативной ветви (читается как ИЛИ)
( Начало подшаблона
) Конец подшаблона
* Повторение ноль или более раз
+ Повторение один или более раз
{ Начало указателя минимального/максимального количества повторений
} Конец указателя минимального/максимального количества повторений
? Указание подшаблона как необязательного

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

Символ Значение
\ Символ отмены специального символа
^ НЕ, только когда используется в начальной позиции
- Используется для указания диапазона символа
назадвверхвперед
Rambler's Top100