Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/169: Рейтинг темы: голосов - 169, средняя оценка - 4.86
Vovan-VE
13154 / 6538 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
#1

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

31.07.2012, 21:40. Просмотров 30570. Ответов 0

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

Обсуждение: http://www.cyberforum.ru/faq/thread631413.html

Вступление

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

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

Данная памятка собирает воедино информацию о том, в каких версиях PHP какие особенности PCRE стали доступны. В данной памятке не рассматриваются версии PHP ниже 5.0. Таким образом, если информация о версии PHP не указана, то подразумевается, что особенность доступна уже в PHP 5.0.

Как оказалось, в официальном справочнике PHP в разделе, посвященном PCRE, задокументированы далеко не все поддерживаемые PCRE особенности. Но в любом случае, данная памятка не является и не будет являться полноценным справочником.

Содержание #

Источники
  1. PCRE в PHP.
  2. ChangeLog for PCRE.
  3. PCRE MAN pages.
  4. «Регулярные выражения», Джеффри Фридл http://www.ozon.ru/context/detail/id/4066500/.



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

В общем случае, модификаторы могут быть включены двумя способами: после второго разделителя в выражении (только включение) или с помощью подвыражений (включение и выключение). Включение первым способом здесь обозначено с помощью /x, а вторым способом - (?x). Не все модификаторы могут быть включены обоими способами.

См. также Переключение модификаторов.

/i, (?i) - case insensitive
Нечувствительная к регистру.

/m, (?m) - multiline
Многострочный режим. Якоря ^ и $ будут совпадать также с позицией "перед" и "после" (соответственно) символа перевода строки \n в любом месте текста.

/s, (?s) - single line
Метасимвол точка . будет совпадает с любым символом, включая \n.

/x, (?x) - extended
Расширенное форматирование. Пробельные символы будут проигнорированы, если находятся вне символьного класса и не экранированы; символ # становится символом начала однострочного комментария (аналогично, если находится вне символьного класса и не экранирован).

/u - UTF-8
Рассматривать строку с выражением и проверяемую строку, как строки в кодировке UTF-8.

/e - eval
PHP >= 5.5 - DEPRECATED
Выражение для замены в функции preg_replace() считается PHP кодом и выполняется аналогично eval() после подстановки обратных ссылок.

/A - anchored
Заякорить выражение к началу текста. Аналогично использованию якоря \A в самом начале выражения.

/D - dollar end only
Метасимвол $ не будет совпадать с позицией перед переводом строки \n, если тот последний в тексте.
Не имеет значения, если включен модификатор /m.

/S - study
Произвести дополнительный анализ выражения для возможного ускорения совпадений.

/U, (?U) - ungreedy
Инвертировать жадность квантификаторов. Квантификаторы повторений по умолчанию станут нежадными, а при добавлении ? - жадными.

/X, (?X) - extra
Запретить экранировать буквы без специального назначения.

(?J) - JCHANGED
PHP >= 5.2.4, PCRE >= 7.2
Разрешить дублирование имён у именованных скобок.
Начиная с PCRE >= 8.00 (PHP >= 5.3.2) внутри сброса ветвления (?|...) имена можно дублировать и без этого модификатора.



Метасимволы # ^

\
Символ экранирования. Имеет смысл только с одним (или более) следующим за ним символом.

Вне символьного класса # ^

^
Якорь начала текста.
При включенном /m также якорь начала логической строки - позиции после символа перевода строки \n.
См. также Якоря.

$
Якорь конца текста или строки.
При отключенном /m - якорь конца текста. Если последний символ текста есть символ перевода строки \n, то якорь совпадет и в позиции перед этим \n, но только если отключен /D.
При включенном /m - якорь конца логической строки - позиции после символа перевода строки \n или конца текста.
См. также Якоря.

.
Один любой символ.
При отключенном /s - любой символ, кроме символа перевода строки \n.
При включенном /s - абсолютно любой символ.

[
Начало символьного класса. См. также Символьные классы.

|
Альтернатива.
Если выражение слева от | не совпало, то проверяется выражение справа от |.
Исключение: условное подвыражение. Там символ | отделяет положительную ветвь от отрицательной.
См. также сброс ветвления (?|...) в Прочие выражения в круглых скобках.

(
)
Начало и конец подвыражения. См. также Выражения в круглых скобках.

?
Если следует сразу за (, то изменяет смысл подвыражения.
Если следует за простым квантификатором повторения, то переключает жадность квантификатора (подвержен влиянию модификатора /U).
В остальных случаях - квантификатор повторения "0 или 1 раз".
См. также Квантификаторы и Выражения в круглых скобках.

*
Квантификатор повторения "0 или более раз". См. также Квантификаторы.

+
Если следует за простым квантификатором повторения, то превращает квантификатор в захватывающий.
В остальных случаях - квантификатор повторения "1 или более раз". См. также Квантификаторы.

{
}
Начало и конец интервального квантификатора. См. также Квантификаторы.

Внутри символьного класса # ^

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

^
Инверсия символьного класса.
Действует, только если является первым символом после открывающего [.

-
Диапазон символов.
Действует, только если слева и справа от него располагаются простые символы (или экранированные последовательности, обозначающие один конкретный символ), не являющиеся границами другого диапазона символов. В противном случае обозначает сам себя.

[
Начало символьного класса POSIX.
Действует только если следующий символ соответствует требованиям. В противном случае обозначает сам себя.

]
Конец символьного класса.



Экранированные последовательности # ^

Простые символы # ^

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

\@ (любой-символ-кроме-буков-и-цифр) - экранирование метасимволов
Отмена служебной роли метасимвола. Может быть применена к любому символу, кроме латинских буков и цифр, как снаружи, так и внутри символьного класса.

\a - символ оповещения BEL (07)

\b - символ возврата backspace (08)
(только внутри символьного класса)

\cX - Ctrl+X

\e - escape (1B)

\f - разрыв страницы (0C)

\n - перевод строки (0A)

\r - возврат каретки (0D)

\t - табуляция (09)

\xHH - символ с указанным шестнадцатиричным ASCII кодом

\x{H} - символ c указанным шестнадцатиричным кодом
PHP >= 5.2.0, PCRE >= 6.5
Внутри {} может находиться любое шестнадцатиричное число. В режиме UTF-8 число может соответствовать любому символу Unicode с указанным кодом.

\ddd - код с указанным восмиричным символом
Следует различать тонкую разницу с обратной ссылкой \dd.

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

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

\d - любой символ цифры

\D - любой символ, кроме цифры

\h - горизонтальный пробельный символ
PHP >= 5.2.4, PCRE >= 7.2

\H - любой символ, кроме горизонтального пробельного символа
PHP >= 5.2.4, PCRE >= 7.2

\s - пробельный символ

\S - любой символ, кроме пробельного символа

\v - вертикальный пробельный символ
PHP >= 5.2.4, PCRE >= 7.2

\V - любой символ, кроме вертикального пробельного символа
PHP >= 5.2.4, PCRE >= 7.2

\w - любой символ "слова"

\W - любой символ, кроме символа "слова"

\N - любой символ, кроме перевода строки
PHP >= 5.3.4, PCRE >= 8.10
Соответствует любому символу, кроме символа перевода строки \n. Эквивалентно метасимволу . при выключенном /s или классу [^\n].

Unicode-символы # ^

\pX, \p{xx}, \P{^xx} - символ с указанным свойством
PHP >= 5.1, PCRE >= 5.0

\PX, \P{xx}, \p{^xx} - символ без указанного свойства
PHP >= 5.1, PCRE >= 5.0

\R - последовательность символов одной новой строки
PHP >= 5.2.2, PCRE >= 7.0

\X - расширенная Unicode последовательность
PHP >= 5.0.5, PCRE >= 5.0

Якоря # ^

Следующие последовательности соответствуют позиции в тексте, аналогично якорям ^ и $.
См. также Якоря.

\b - граница слова
(только вне символьного класса)

\B - не граница слова
(только вне символьного класса)

\A - начало текста

\Z - конец логического текста

\z - конец физического текста

\G - позиция начала поиска или последнего успешного совпадения

Обратные ссылки # ^

\dd - числовая обратная ссылка
(обратная ссылка)
Следует различать тонкую разницу с восмиричным кодом \ddd.

\gn, \g{N}, \g{-N} - числовая обратная ссылка
PHP >= 5.2.2, PCRE >= 7.0

\g<N>, \g<-N>, \g'N', \g'-N' - числовая обратная ссылка
PHP >= 5.2.7, PCRE >= 7.7

\k<name>, \k'name' - именованная обратная ссылка
PHP >= 5.2.2, PCRE >= 7.0

\k{name}, \g{name} - именованная обратная ссылка
PHP >= 5.2.4, PCRE >= 7.2

\g<name>, \g'name' - именованная обратная ссылка
PHP >= 5.2.7, PCRE >= 7.7

Именованная обратная ссылка в виде (?P=name) была введена гораздо раньше. См. Прочие выражения в круглых скобках.

Прочее # ^

\C - один любой байт даже в режиме UTF-8

\K - сброс начала совпадения
PHP >= 5.2.4, PCRE >= 7.2

\Q...\E - отключение метасимволов
Любые символы, расположенные между \Q и \E, теряют свой особый смысл и превращаются в простые символы, которые обозначают сами себя.



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

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

Внутри символьного класса следующие вещи имеют специальное назначение:

] - конец символьного класса

^ - инверсия символьного класса
Действует, только если следует сразу за открывающим [. В остальных случаях означает сам себя.

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

[:class:] - любой символ из класса POSIX с указанным именем
[:^class:] - любой символ, кроме символа из класса POSIX с указанным именем.
Например: [^89[:^digit:].-]



Якоря # ^

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

^ - начало текста или строки
При отключенном /m совпадает только с началом проверяемой строки - начало текста.
При включенном /m также совпадает и с началом логической строки - позиция после символа перевода строки \n.

$ - конец текста или строки
По умолчанию совпадает с логическим концом текста: позиция в самом конце текста или, если последний символ текста есть \n, перед ним.
Включенный модификатор /D запрещает совпадение перед последним \n, т.е. остаётся только самый конец текста.
При включенном /m совпадает также с концом логической строки текста - позиция перед символом перевода строки \n. В этом случае модификатор /D не играет роли.

\b - граница слова
(только вне символьного класса)
Позиция в тексте, где с одной стороны есть символ слова (символ из класса \w), а с другой стороны нет символа слова (т.е. либо есть символ не-слова \W, либо вообще нет символа).

\B - не граница слова
(только вне символьного класса)
Позиция в тексте, где либо с обоих сторон есть символы слова (символы из класса \w), либо с обоих сторон одновременно нет таких символов.

\A - начало текста
Позиция начала текста. Соответствует якорю ^ при выключенном /m.

\Z - логический конец текста
Позиция логического конца текста. Соответствует якорю $ при отключенных /D и /m.

\z - физический конец текста
Позиция физического конца текста. Соответствует якорю $ при включенном /D и отключенном /m.

\G - начальная точка проверки
Позиция, в которой начинается/продолжается поиск совпадения. При поиске первого вхождения соответствует месту начала поиска, которое задаётся аргументом $offset в функциях проверки и замены. При последующих поисках (поиске всех совпадений, замена всех вхождений) соответствует позиции конца последнего успешного совпадения.
При поиске одного совпадения соответствует якорю \A только если $offset есть 0.



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

Квантификаторы предназначены для повторения совпадения простых выражений.

Простые квантификаторы # ^

? - 0 или 1 совпадение
+ - 1 или более совпадений
* - 0 или более совпадений
{N} - ровно N совпадений
{M,} - M и более совпадений
{M,N} - от M до N совпадений

Жадные и нежадные квантификаторы # ^

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

??
+?
*?
{N}?
{M,}?
{M,N}?

Если включен модификатор /U, жадность квантификаторов инвертируется. По умолчанию простые квантификаторы становятся нежадными (минимальными), а с дополнительным ? - жадными (максимальными).

Захватывающие квантификаторы # ^

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

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

Захватываюшие квантификаторы создаются добавлением символа + сразу за простым квантификатором:

?+
++
*+
{N}+
{M,}+
{M,N}+



Выражения в круглых скобках # ^

Подробности по каждому в соответствующем разделе.

Переключение модификаторов

(?ab)
(?ab-xy)
(?-xy)

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

(...)
(?:...)
(?ab:...)
(?ab-xy:...)
(?-xy:...)
(?P<name>...)
(?'name'...) PHP >= 5.2.2, PCRE >= 7.0
(?<name>...) PHP >= 5.2.2, PCRE >= 7.0

Утверждения / Заглядывание вперед и назад

(?=...)
(?!...)
(?<=...)
(?<!...)

Рекурсивные выражения

(?R)
(?N)
(?+N) PHP >= 5.2.4, PCRE >= 7.2
(?-N) PHP >= 5.2.4, PCRE >= 7.2
(?P>name)
(?&name) PHP >= 5.2.2, PCRE >= 7.0

Условное выражение

(?(cond)выражение-да)
(?(cond)выражение-да|выражение-нет)

Прочие

(?#...)
(?P=name)
(?|...) PHP >= 5.2.4, PCRE >= 7.2
(?>...)
(?C) в PHP не реализовано, PCRE >= 4.0
(?CN) в PHP не реализовано, PCRE >= 4.0



Переключение модификаторов # ^

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

(?ab) - включить модификаторы a и b
(?ab-xy) - включить модификаторы a и b и отключить модификаторы x и y
(?-xy) - отключить модификаторы x и y

См. также Подвыражение.



Подвыражение # ^

(...) - сохраняющая скобка
Обычное подвыражение, сохраняющее обратную ссылку в случае успешного совпадения. Скобки нумеруются с начала всего выражения от 1.

(?:...) - несохраняющая, группирующая скобка
Подвыражение предназначено лишь для группировки. Результат совпадения не сохраняется, обратная ссылка не создаётся.

(?ab:...)
(?ab-xy:...)
(?-xy:...) - интервальное переключение модификаторов
Комбинация группирующей скобки и переключения режима. Изменение модификаторов накладывается на выражение внутри скобки.
См. также Переключение модификаторов.

(?P<name>...) - именованная сохраняющая скобка
Подвыражение в случае успешного совпадения сохраняется в именованную обратную ссылку. Помимо имени скобка также является и обычной сохраняющей скобкой, поэтому также имеет номер.

(?'name'...)
(?<name>...) - именованная сохраняющая скобка
PHP >= 5.2.2, PCRE >= 7.0
Альтернативный синтаксис именованной скобки был добавлен позже для совместимости.



Утверждения / Заглядывание вперед и назад # ^

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

См. также Условное выражение.

(?=...) - позитивное заглядывание вперед
(?!...) - негативное заглядывани вперед
Позиция в тексте, непосредственно за которой присутствует (для позитивного) или отсутствует (для негативного) строка (или так же позиция в тексте), удовлетворяющая указанному выражению.

(?<=...) - позитивное заглядывание назад
(?<!...) - негативное заглядывани назад
Аналогично предыдущему, но подвыражение применяется к тексту перед текущей позицией.
Также подвыражение в скобках должно совпадать только со строкой фиксированной длины, чтобы PCRE знал, на сколько символов назад надо заглянуть.



Рекурсивные выражения # ^

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

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

См. также Условное выражение.

(?R)
(?0) - рекурсия на все выражение
(?N) - рекурсия на скобку с номером N.

(?+N) - относительная рекурсия на N скобок вперед
(?-N) - относительная рекурсия на N скобок назад
PHP >= 5.2.4, PCRE >= 7.2
Относительная рекурсия освобождает от необходимости расставлять обсолютные номера скобок во всём выражении.

(?P>name) - рекурсия на именованную скобку

(?&name) - рекурсия на именованную скобку
PHP >= 5.2.2, PCRE >= 7.0
Альтернативный синтаксис был добавлен позже для совместимости.



Условное выражение # ^

(?(cond)выражение-да)
(?(cond)выражение-да|выражение-нет)
Если условие cond истино, то выполняется проверка выражения-да. В противном случае выполняется проверка выражения-нет, если оно указано.

Условие cond может быть одним из:

Проверка совпадения подвыражения # ^

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

N - совпала ли скобка с номером N

+N - совпала ли следующая N'ая скобка
-N - совпала ли предыдующая N'ая скобка
PHP >= 5.2.4, PCRE >= 7.2

name - совпала ли скобка с именем name
PHP >= 5.2.0, PCRE >= 6.7

<name>
'name' - совпала ли скобка с именем name
PHP >= 5.2.2, PCRE >= 7.0

Проверка рекурсивности # ^

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

R - выполняется ли проверка рекурсивно вообще

RN - ближайшая рекурсия есть рекурсии на скобку с указанным номером
PHP >= 5.2.2, PCRE >= 7.0

R&name - ближайшая рекурсия есть рекурсии на скобку с указанным именем
PHP >= 5.2.2, PCRE >= 7.0

Утверждение # ^

Условие считается истинным, если текущая позиция удовлетворяет указанному утверждению.
См. Утверждения / Заглядывание вперед и назад.

?=... - позитивное заглядывание вперед
?!... - негативное заглядывание вперед
?<=... - позитивное заглядывание назад
?<!... - негативное заглядывание назад

DEFINE # ^

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

DEFINE
PHP >= 5.2.2, PCRE >= 7.0


Прочие выражения в круглых скобках # ^

(?#...) - комментарий
Строка внутри скобок считается комментарием и никак не влияет на совпадения. Невозможно вписать символ скобки ) внутрь комментария.

(?P=name) - обратная ссылка на именованную скобку

(?|...) - сброс нумерации в ветвлении
PHP >= 5.2.4, PCRE >= 7.2
Сохраняющие скобки внутри такого выражения будут перенумеровываться заново в каждой ветви альтернативы, находящейся непосредственно внутри этого выражения.

(?>...) - атомарная группировка
Выражение внутри этой скобки в случае несовпадения никогда не будет подвергаться откату назад для повторной попытки.

(?C)
(?CN) - callout
в PHP не реализовано, PCRE >= 4.0
Данное выражение подразумевает вызов пользовательской функции с передачей служебной информации и определенной реакцией PCRE на результат функции. В PHP эта возможность не реализована. Хотя выражение успешно распознаётся самим PCRE, в PHP это выражение не делает ничего и в результате всегда считается истинным (совпадает с пустой строкой).
42
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2012, 21:40
Ответы с готовыми решениями:

Вопрос по регулярным выражениям PCRE
&lt;\w+ *&gt; - любой тег Зачем мы в этой конструкции ставим * ?

Документация по регулярным выражениям
Сабж. Помогите найти более полную документацию по регулярным вырожениям на...

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

Вопрос по регулярным выражениям
Добрый день! Подскажите, как выбрать из строки &quot;Цвет: ARTHUR_1 Ширина (м): 3...

PCRE. Нужна регулярка
Всем привет! Здесь есть знатоки регулярок? У меня проблема, 5-й день мозг...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 21:40

PCRE: 5 и более слов в строке
Скажите пожалуйста. Есть файл со строками текста (windows-1251) Есть выражение....

Замена строк в текстовом файле по нескольким рег выражениям
Мое почтение! Помогите решить следующую задачу. Имеется текстовый файл...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru