|
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
|
|
Памятка по регулярным выражениям PCRE в PHP31.07.2012, 21:40. Показов 43738. Ответов 0
Памятка по регулярным выражениям PCRE в PHP
Обсуждение: https://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 особенности. Но в любом случае, данная памятка не является и не будет являться полноценным справочником. Содержание #
Источники
Модификаторы # ^ В общем случае, модификаторы могут быть включены двумя способами: после второго разделителя в выражении (только включение) или с помощью подвыражений (включение и выключение). Включение первым способом здесь обозначено с помощью /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 может быть одним из:
Прочие выражения в круглых скобках # ^ (?#...) - комментарий Строка внутри скобок считается комментарием и никак не влияет на совпадения. Невозможно вписать символ скобки ) внутрь комментария. (?P=name) - обратная ссылка на именованную скобку (?|...) - сброс нумерации в ветвлении PHP >= 5.2.4, PCRE >= 7.2 Сохраняющие скобки внутри такого выражения будут перенумеровываться заново в каждой ветви альтернативы, находящейся непосредственно внутри этого выражения. (?>...) - атомарная группировка Выражение внутри этой скобки в случае несовпадения никогда не будет подвергаться откату назад для повторной попытки. (?C) (?CN) - callout в PHP не реализовано, PCRE >= 4.0 Данное выражение подразумевает вызов пользовательской функции с передачей служебной информации и определенной реакцией PCRE на результат функции. В PHP эта возможность не реализована. Хотя выражение успешно распознаётся самим PCRE, в PHP это выражение не делает ничего и в результате всегда считается истинным (совпадает с пустой строкой).
44
|
|
| 31.07.2012, 21:40 | |
|
Ответы с готовыми решениями:
0
Не знаю как настроить расширение PCRE для работы с регулярными выражениям Вопрос по регулярным выражениям |
| 31.07.2012, 21:40 | |
|
Помогаю со студенческими работами здесь
1
Вопрос по регулярным выражениям
Вопрос по регулярным выражениям. Помощь по регулярным выражениям Поиск по регулярным выражениям Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|