preg_grep — Возвращает массив вхождений, которые соответствуют шаблону


Содержание

preg_grep неправильно?

Использование того же регулярного выражения с javascript будет соответствовать только «cat09», но в php это возвращает:

Что мне нужно написать, чтобы он возвращал только «cat09»?

EDIT: вы хотите увидеть javascript. Функция соответствия javascript с флагом ‘g’ является эквивалентной функцией preg_grep в php, но она не принимает массив — вот скрипка, каждая из которых является отдельной строкой. http://jsfiddle.net/64A5w/

EDIT: jsfiddle опущен, так что вот эквивалент javascript. Сначала я должен упомянуть, preg_grep принимает только массивы и автоматически возвращает глобальные совпадения (он не принимает флаг ag). Javascript match принимает только строки, а g должен быть указан.

который отображает: r,and,dy . Эквивалент php будет передавать preg_grep $str = array(‘r%and_dy’) . Он должен возвращать тот же массив. Но он возвращает r%and_dy как одно совпадение (как показано выше).

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

Значения ^ и $ означают начало и конец строки соответственно.

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

10 регулярных выражений для web-разработчиков

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

Регулярное выражение Значение
foo Строка «foo»
^foo «foo» в начале строки
foo$ «foo» в конце строки
^foo$ В строке содержится только одно слово»foo»
[abc] a, b, или c
[a-z] Все буквы в нижнем регистре
[^A-Z] Любой символ, который не является буквой в верхнем регистре
[0-9.-] Любая цифра, точка или дефис
^[a-zA-Z0-9_]<1,>$ Любое слово содержащее 1 букву, цифру или _

PHP функции для работы с регулярными выражениями

Функция Описание
preg_match() Функция preg_match() ищет в заданном тексте совпадения с шаблоном, если совпадене есть возвращает true, если нет то false
preg_match_all() Функция выполняет поиск шаблона в статье
preg_replace() Функция preg_replace() выполняет поиск и замену по регулярному выражению
preg_split() Функция preg_split() разбивает строку по регулярному выражению
preg_grep() Функция preg_grep() возвращает массив, состоящий из элементов входящего массива , которые соответствуют заданному шаблону
preg_ quote() Функция preg_ quote() принимает строку и добавляет обратный слеш перед каждым служебным символом. Проще говоря, она экранирует символы

Валидация имени домена
Проверяем имя домена.

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

Удаление повторяющихся слов
Написали пару одинаковых слов? Не проблема, с помощью этого регулярного выражения вы сможете их легко удалить.

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

Автоматическая генерация смайликов
Замена смайликов на картинки.

Проверка логина
Логин может состоять из букв, цифр, дефисов и подчёркиваний. Длина от 3 до 16 символов.

Проверка email
Email должен быть такого вида: логин@поддомен.домен.

Проверяем шестнадцатиричный цвет
Цвет может быть задан и без «#»;

Получаем title страницы
С помощью этого регулярного выражения, можно вытащить title страницы.

Проверка времени
Время должно быть задано в таком виде: mm:hh.

regex — php preg_match_all, возвращающий массив массивов

Я хочу заменить некоторые теги шаблона:

почему внутри 2 массива? Как добиться только второго?

Решение

Это потому, что у вашего регулярного выражения может быть несколько групп соответствия — если у вас есть больше (..) у вас будет больше записей в вашем массиве. Первый [0] — это всегда весь матч.

Если вы хотите другой порядок массива, вы можете использовать PREG_SET_ORDER в качестве 4. аргумента для preg_match_all. Выполнение этого приведет к следующему

это может быть проще, если вы зациклите свой результат в цикле foreach.

Если вы интересовались только в первом матче — вы должны остаться по умолчанию PREG_PATTERN_ORDER и просто использовать $matches[1]

Другие решения

Сортировать ответ:

Есть ли альтернатива? Есть конечно: косвенные утверждения Позволяет легко использовать совпадения одинарного символа нулевой ширины (без захвата):

Будет сбрасывать это:

  • (? : положительный взгляд за спиной — совпадать только с остальной частью шаблона, если есть < персонаж перед ним (но не захватывайте его)
  • \w+ : символы слова совпадают
  • (?=>) : соответствовать только предыдущему шаблону, если за ним следует > характер (но не захватывать > голец)

Это так просто: шаблон использует <> символы-разделители как условия для матчей, но не фиксируют их

Причина по которой $matches выглядит так, как это делается довольно просто: при использовании preg_match(_all) первой записью в массиве совпадений всегда будет вся строка, соответствующая данному регулярному выражению. Вот почему я использовал обходные утверждения нулевой ширины вместо групп. Ваше выражение соответствует «» в целом, и выдержки «name» через группировку.
Массив совпадений будет содержать полное совпадение по индексу 0 и добавляйте группы в каждый последующий индекс, в вашем случае это означает, что:

  • $matches[0] будет содержать все соответствующие подстроки /\<\w+\>/ как образец.
  • $matches[1] будет содержать все подстроки, которые были захвачены ( /\<(\w+)\>/ захваты (\w+) ).

Если бы у вас было такое регулярное выражение: /\<((\w)([^>]+))>/ массив match будет выглядеть примерно так:

Зачем? просто, потому что шаблон содержит 3 соответствующих группы. Как я уже сказал: первый индекс в массиве совпадений всегда будет полным совпадением, независимо от групп захвата. Затем группы добавляются в массив в порядке, в котором они появляются в выражении. Итак, если мы проанализируем выражение:

  • \ < : не соответствует, но часть шаблона, будет только в $matches[0] ценности
  • ((\w)([^>]+)) : Начало первой подходящей группы, \w[^>]+ матч сгруппирован здесь, $matches[1] будет содержать эти значения
  • (\w) : Вторая группа, одиночка \w символ (т.е. первый символ после < , $matches[2] поэтому будет содержать все первые символы после <
  • ([^>]+) : Третья группа, соответствует остатку строки после <\w до >встречается, это будет разглядеть $matches[3] ценности

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

Глядя на группы захвата, теперь вы можете с уверенностью сказать, что $matches будет выглядеть, и вы можете смело сказать, что $matches[2] будет массив отдельных символов.

Конечно, это может заставить вас задуматься, почему $matches 2D массив Ну, это опять-таки очень легко: вы можете предсказать, сколько индексов совпадений $matches массив будет содержать: 1 для полного шаблона, затем +1 для каждой группы захвата. Что ты не может предсказать, однако, сколько совпадений вы найдете.
И что preg_match_all действительно очень просто: заполните $matches[0] со всеми подстроками, которые соответствуют всему шаблону, затем извлеките каждую подстроку группы из этих соответствий и добавьте это значение к соответствующему $matches массивы. Другими словами, количество массивов, которые вы можете найти в $matches это дано: это зависит от модели. Количество ключей, которые вы можете найти в под-массивах $matches неизвестно, это зависит от строки, которую вы обрабатываете. Если preg_match_all если бы вернуть 1D массив, было бы намного сложнее обрабатывать совпадения, теперь вы можете просто написать это:

Если preg_match_all Создав плоский массив, вы должны будете отслеживать количество групп в вашем шаблоне. Всякий раз, когда шаблон изменяется, вы также должны будете обновлять остальную часть кода, чтобы отразить изменения, внесенные в шаблон, что усложняет поддержку вашего кода, в то же время делая его более подверженным ошибкам, а также

Очередной блог фрилансера

коротко и полезно о веб-разработке

15 регулярных выражений PHP в помощь веб-разработчику

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

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

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

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

Регулярное выражение Означает
foo Строка “foo”
^foo Строка начинается с “foo”
foo$ Строка заканчивается на “foo”
^foo$ «foo» встречается в строке только один раз
[abc] a, b, или c
[a-z] любой символ в нижнем регистре
[^A-Z] любой символ, не находящийся в верхнем регистре
(gif|jpg) Означает как «gif” так и “jpeg”
[a-z]+ Один или более символов нижнего регистра
[0-9.-] Любая цифра, точка или знак минус
^[a-zA-Z0-9_]<1,>$ Любое слово, хотя бы одна буква, число или _
([wx])([yz]) wy, wz, xy, или xz
(^A-Za-z0-9) Любой символ (не число и не буква)
([A-Z]<3>|[0-9]<4>) Означает три буквы или 4 цифры

PHP-функции для регулярных выражений

Функция Описание
preg_match() Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях
preg_match_all() Функция preg_match_all() находит все вхождения строки, заданной по шаблону
preg_replace() Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение.
preg_split() Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска.
preg_grep() Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения.
preg_quote() Экранирует символы регулярного выражения

Проверка доменного имени

Проверяем, является ли строка правильным доменным именем

Подсветка слова в тексте

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

Подсветка результатов поиска в WordPress блоге

Как уже говорилось в предыдущем примере, этот пример кода, удобно использовать в выдаче поисковых результатов и есть отличный способ внедрить эту функцию в wordpress-блог.

Откройте ваш файл search.php, и найдите функцию the_title(). Замените ее следующим кодом:

Теперь, выше этой строки, добавьте этот код:

Сохраните файл search.php, и откройте style.css. Добавьте следующую строку:

Получение всех картинок из HTML-документа

Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL

Удаление повторяющихся слов (не чувствителен к регистру)

Во время печатания, часто повторяются слова? Поможет это регулярное выражение.

Удаление повторяющейся пунктуации

То же самое, только для пунктуации. Попрощайтесь с двойными запятыми.

Поиск XML/HTML тэгов

Эта простая функция, принимает два аргумента. Первый – это тэг, который вам нужно найти, и второй – это переменная, содержащая XML или HTML. Повторюсь, эту функцию очень удобно использовать вместе с cURL.

Поиск XHTML/XML тэгов с определенным значением атрибута

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

Поиск шестнадцатеричных значений цветов

Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.

Поиск заголовка статьи

Этот фрагмент кода найдет и выведет на экран текст, находящийся внутри тэгов , на html-странице.

Парсинг логов Apache

Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?

Замена двойных кавычек “умными” кавычками

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

Комплексная проверка пароля

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

Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.

WordPress: Использование регулярного выражения для получения картинок из записи

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

Для того, чтобы использовать этот код, просто вставьте его в любой файл вашей темы.

Генерация автоматических смайлов

Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.

Перевод статьи “15 PHP regular expressions for web developers”, автор Jean-Baptiste Jung

Рассказать друзьям

Понравилась статья? Лучший способ сказать спасибо — поделиться ссылкой в социальных сетях:

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

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]<6>» (если, например, от шести до восьми цифр, тогда «[0-9]<6,8>»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

Вместо набора символов может быть использовано обозначение любого символа — точка, может быть указан конкретный набор символов (поддерживаются последовательности — упоминавшиеся «0-9»). Может быть указано «кроме данного набора символов».

Указатель количества символов в официальной документации по php называется «квантификатор». Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение — либо одно фиксированное («<6>»), либо как числовой промежуток («<6,8>»), так и абстрактное «любое число, в т.ч. 0» («*»), «любое натуральное число» — от 1 до бесконечности («+»: «document[0-9]+.txt»), «либо 0, либо 1» («?»). По умолчанию квантификатор для данного набора символов равен единице («document[0-9].txt»).

Для более гибкого поиска сочетаний эти связки «набор символов — квантификатор» можно объединять в метаструктуры.

Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая «там» строка. Из примеров: поисковый код , в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: » +» заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация «(.*)» в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон «двигается» программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация «(.*)» означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

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

. точка любой символ
[ ] квадратные скобки класс символов («любое из»). Например [abcdef]
[^ ] негативный класс символов («любое кроме»)
тире обозначение последовательности в классе символов («[0-9]» — цифры)
\d [0-9] Только цифры
\D [^0-9] Кроме цифр
\w [a-z0-9] Буквы и цифры
\W [^a-z0-9] Кроме букв и цифр
\s [ ] Пробельные символы: пробел, табуляция, перевод строки
\S [^ ] Кроме пробельных символов
| (одно|другое) На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: … )

Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

Квантификатор

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

Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

* «звёздочка» или знак умножения
+ плюс
? вопросительный знак

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

Якоря

^ привязка к началу строки
$ привязка к концу строки

Эти символы должны стоять соответственно в самом начале и в самом конце строки.

Жадность

Вопросительный знак выступает еще и как минимизатор квантификатора:
.*?

Результат работы примера:

Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:

i регистронезависимый поиск
m многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы «^» и «$» совпадают только с началом и концом всего текста. Когда этот параметр установлен, «^» и «$» совпадают с началом и концом отдельных строк.
s символ «.» (точка) совпадает и с переносом строки (по умолчанию — нет)
A привязка к началу текста
E заставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m.
U Инвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»).
e Строка замены интерпретитуется как PHP код.

Функции для работы с регулярными выражениями

  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match — Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_quote — Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т.п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену
  • preg_split — Разбивает строку по регулярному выражению

preg_grep

Функция preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

array preg_grep (string pattern, array input [, int flags])

preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.

Параметр flags может принимать следующие значения:

PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:

preg_match

Функция preg_match — Выполняет проверку на соответствие регулярному выражению

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

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

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее.

Пример кода

Пример кода

Пример кода

Результат работы примера:

domain name is: htmlweb.ru

preg_match_all

Функция preg_match_all — Выполняет глобальный поиск шаблона в строке

int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])

Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.

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

Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

Пример кода

Результат работы примера:

Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

Пример кода

Результат работы примера:

В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

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

В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.

Пример кода

Пример кода


Результат работы примера:

preg_quote

Функция preg_quote — Экранирует символы в регулярных выражениях

string preg_quote (string str [, string delimiter])

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’.

В регулярных выражениях служебными считаются следующие символы: . \\ + * ? [ ^ ] $ ( ) < >= ! | :

Пример кода

Пример кода

Результат работы примера:

preg_replace

Функция preg_replace — Выполняет поиск и замену по регулярному выражению

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Replacement может содержать ссылки вида \\n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n’нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией \$<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.

Результатом работы этого примера будет:

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

Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.

The bear black slow jumped over the lazy dog.
Используя ksort(), получаем желаемый результат:

The slow black bear jumped over the lazy dog.

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

В случае, если параметры pattern и replacement являются массивами, preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены. Если массив replacement содержит больше элементов, чем pattern, вместо недостающих элементов для замены будут взяты пустые строки. В случае, если pattern является массивом, а replacement — строкой, по каждому элементу массива pattern будет осущесвтлен поиск и замена на pattern (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной). Вариант, когда pattern является строкой, а replacement — массивом, не имеет смысла.

Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример кода: Замена по нескольким шаблонам

Этот пример выведет:

Пример кода: Использование модификатора /e

Пример кода: Преобразует все HTML-теги к верхнему регистру

preg_replace_callback

Функция preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback функцию, которой в качестве входящего параметра передается массив найденных вхождений. Ожидаемый результат — строка, которой будет произведена замена.

Пример кода

preg_split

Функция preg_split — Разбивает строку по регулярному выражению

array preg_split (string pattern, string subject [, int limit [, int flags]])

Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.

В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок. Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.

flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):

PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.

PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.

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

Примеры кода

В случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно:

preg_grep

(PHP 4, PHP 5, PHP 7)

preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

Описание

Возвращает массив, состоящий из элементов входящего массива input , которые соответствуют заданному шаблону pattern .

Список параметров

Искомый шаблон, строка.

В случае, если установлен в PREG_GREP_INVERT , функция preg_grep() возвращает те элементы массива, которые не соответствуют заданному шаблону pattern .

Возвращаемые значения

Возвращает массив, индексированный ключами из массива input .

Примеры

Пример #1 Пример использования preg_grep()

Смотрите также

  • Регулярные выражения PCRE
  • preg_quote() — Экранирует символы в регулярных выражениях
  • preg_match_all() — Выполняет глобальный поиск шаблона в строке
  • preg_filter() — Производит поиск и замену по регулярному выражению
  • preg_last_error() — Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes 4 notes

A shorter way to run a match on the array’s keys rather than the values:

function preg_grep_keys ( $pattern , $input , $flags = 0 ) <
return array_intersect_key ( $input , array_flip ( preg_grep ( $pattern , array_keys ( $input ), $flags )));
>
?>

Run a match on the array’s keys rather than the values:

function preg_grep_keys ( $pattern , $input , $flags = 0 )
<
$keys = preg_grep ( $pattern , array_keys ( $input ), $flags );
$vals = array();
foreach ( $keys as $key )
<
$vals [ $key ] = $input [ $key ];
>
return $vals ;
>

An even shorter way to run a match on the array’s keys rather than the values:

function preg_grep_keys ( $pattern , $input , $flags = 0 ) <
return array_flip ( preg_grep ( $pattern , array_flip ( $input ), $flags ) );
>
?>

A very simple example to match multiple «.»(dot) in an array value:-

= array( «23.32» , «22» , «12.009» , «23.43.43» );
print_r ( preg_grep ( «/^(\d+)?\.\d+\.\d+$/» , $array ));

preg_match возвращает массив с дублями

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

Для моего решения не подходит, так как данные иногда могут совпадать.

4 ответа 4

Первый – не использовать именованные подмаски и тогда у вас будет обычный индексный массив.

Второй – обработать текущий массив удалив все числовые ключи:

Третий – не использовать вообще регулярку, если вам нудно просто разбит строку с одним единственным разделителем:

вернет не ассоциативный массив вида

Регулярным выражением тут ничего не сделаешь. Как вариант можно пробежаться по массиву и сделать unset для всех элементов у которых индекс является целым числом.

Можно через банальный foreach или через array_filter

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

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

Модификаторы Fenom в MODx

14 Августа 2020

27 Октября 2020

Оглавление

Для начала рекомендую почитать официальную документацию по модификаторам в Fenom.

Модификаторы Fenom в MODx

Fenom умеет использовать сниппеты MODx в качестве модификаторов. Например, установив компонент dateAgo, вы сразу можете использовать его для вывода дат:

Также работает и Jevix, и любые другие сниппеты-фильтры MODx, которые принимают параметры $input и $options .

Модификаторы могут работать последовательно:

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

Встроенные модификаторы

В Fenom есть встроенные модификаторы. Модификаторы могут быть применены к переменным, пользовательским функциям или строкам. Для их применения надо после модифицируемого значения указать символ | (вертикальная черта) и название модификатора. Так же модификаторы могут принимать параметры, которые влияют на их поведение. Эти параметры следуют за названием модификатора и разделяются : (двоеточием).

Вот список модификаторов и описание (в скобках указаны равноценные синонимы):

Форматирование даты через функцию date . Если переменная пуста, будет получено текущее время.

date_format

Форматирование даты через функцию strftime . Если переменная пуста, будет получено текущее время. В модификаторе необходимо использовать конверсионные указатели:

escape (e)

Экранирование переменной. Первым параметром принимает режим работы, вторым — кодировку. Используется для кодирования или экранирования спецсимволов по алгоритмам экранирования HTML, URL’ов и Javascript. По умолчанию активирован режим экранирования HTML .

Модификатор поддерживает несколько режимов работы:

  • html — экранирует HTML сущности в строке.
  • url — экранирует строку для использования в URL.
  • js — экранирует строку для использования в JavaScript.

#

unescape

Декодирование переменной. Модификатор unescape является обратным действием модификатора escape . Так же имеет режимы html , js and URI .

truncate (ellipsis)

Обрезает переменную до определенной длинны, по умолчанию — 80 символов. В качестве необязательного второго параметра, вы можете передать строку текста, которая будет отображаться в конце обрезанной переменной. Символы этой строки не включаются в общую длину обрезаемой строки. По умолчанию, truncate попытается обрезать строку в промежутке между словами. Если вы хотите обрезать строку строго на указанной длине, передайте в третий необязательный параметр значение true.

  • $length , обязателен. Определяет максимальную длину обрезаемой строки.
  • $etc , по умолчанию … Текстовая строка, которая заменяет обрезанный текст. Её длинна НЕ включена в максимальную длину обрезаемой строки.
  • $by_word , по умолчанию FALSE. Определяет, обрезать ли строку в промежутке между словами (true) или строго на указанной длине (false).
  • $middle , по умолчанию FALSE. Определяет, нужно ли обрезать строку в конце (false) или в середине строки (true).

#

strip

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

length (len, strlen)

Подсчитывает длину строки, массива, объекта. Может принимать строку или массив.

count

Подсчитывает количество элементов, например в массиве.

Оператор проверки наличия подстроки в строке или значения в массиве.

iterable

Проверка возможности перебора переменной.

replace

Заменяет все вхождения строки поиска на строку замены.

Возвращает строку, в котором все вхождения $search в $subject заменены на $replace .

ereplace

Выполняет поиск и замену по регулярному выражению.

Выполняет поиск совпадений в строке $subject с шаблоном $pattern и заменяет их на $replacement .

$replacement может содержать ссылки вида \n, $n или $, причем последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n-ой подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо 0 $) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы. Для использования обратного слэша, его необходимо продублировать.

match

Проверяет совпадение строки с паттерном. Среднестатистический пользователь знаком с подстановками оболочки, как минимум с самыми простыми из них — ? и * , так что использование match вместо ematch для поиска в пользовательской части сайта может быть намного удобнее для пользователей, не являющихся программистами.

  • ? — соответствие одному или нулю любых символов. ?at соответствует Cat , cat , Bat или bat .
  • * — соответствие любому количеству символов. Law* соответствует Law , Laws , или Lawyer .
  • [characters] — соответствие символа группе символов. [CB]at соответствует Cat или Bat , но не cat , rat или bat .
  • \ — экрнирующийсимвол. Law\* будет соответвовать только Law* .

#

ematch

Выполняет проверку на соответствие регулярному выражению.

Ищет в заданном тексте $subject совпадения с шаблоном $pattern .

split

Разбивает строку и возвращает массив, используя первый параметр в качестве разделителя (по умолчанию — , ).

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

esplit

Разбивает строку по регулярному выражению в первом параметре (по умолчанию /,\s*/).

Объединяет элементы массива в строку, используя первый параметр в качестве соединителя (по умолчанию — , ).

Объединяет элементы массива с помощью строки $delimiter .

number (number_format)

Форматирование числа php функцией number_format() .

Функция принимает один, два или четыре аргумента (не три):

  • $number — Форматируемое число.
  • $decimals — Устанавливает число знаков после запятой.
  • $dec_point — Устанавливает разделитель дробной части.
  • $thousands_sep — Устанавливает разделитель тысяч.

#

md5, sha1, crc32

Подсчёт контрольной суммы строки разными алгоритмами.

urldecode, urlencode, rawurldecode

Обработка строки соответствующей PHP функцией.

base64_decode, base64_encode

Кодирование и декодирование строки алгоритмом base 64.

json_encode (toJSON), json_decode (fromJSON)

Кодирование и декодирование JSON.

http_build_query

Генерация URL-кодированной строки из массива.

Распечатка переменной через PHP функцию. Если передан параметр, то можно сохранить результат.

var_dump (dump)

Распечатка переменной вместе с типом.

nl2br

Вставляет HTML-код разрыва строки
перед каждым переводом строки.

lower (low, lcase, lowercase, strtolower)

Переводит строку в нижний регистр. Является эквивалентом функции PHP strtolower() .

upper (up, ucase, uppercase, strtoupper)

Переводит строку в верхний регистр. Является эквивалентом функции PHP strtoupper() .

ucwords

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

ucfirst

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

htmlent (htmlentities)

Преобразует все возможные символы в соответствующие HTML-сущности.

limit

Обрезка строки до указанного количества символов.


esc (tag)

Экранирование HTML и MODx тегов.

notags (striptags, stripTags, strip_tags)

Удаление HTML тегов из строки.

stripmodxtags

Удаление тегов MODx из строки.

cdata

Оборачивает вывод тегами CDATA. Обычно это нужно для экранирования значений в XML разметке.

reverse (strrev)

Переворачивает строку символ за символом.

wordwrap

Вставляет перенос строки после каждого n-ого символа (слова не разбиваются).

wordwrapcut

Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова.

fuzzydate

Выводит дату относительно сегодня и вчера, используя словари системы. Если прошло уже больше 2х дней, то форматирует дату через strftime .

declension (decl)

Склоняет слово, следующее за числом по правилам русского языка. Например: 1 яблоко, 2 яблока, 10 яблок. Вторым параметром указывается выводить ли само число, по умолчанию выводится только подходящий вариант слова. Разделитель вариантов можно задавать третьим параметром, по умолчанию | .

ismember (memberof, mo)

Проверка принадлежности пользователя к группе или группам пользователей MODx. Если переменная пуста, то проверка проводится для текущего пользователя.

isloggedin, isnotloggedin

Проверка авторизации текущего пользователя в контексте. Если контекст не указан, то проверяется текущий.

Генерация ссылки на документ системы через modX::makeUrl .

lexicon

Вывод записи из словарей системы через modX:lexicon . Некоторые словари предварительно нужно загрузить.

user (userinfo)

Вывод поля пользователя системы.

resource

Вывод поля документа системы. Можно выводить и ТВ параметры.

print

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

setOption

Выставление значения в массив modX:config . Обязательно нужно указать ключ значения в массиве.

option (getOption)

Получение значения из массива modX::config .

setPlaceholder (toPlaceholder)

Выставление значения в массив modX::placeholders . Обязательно нужно указать ключ значения в массиве.

placeholder (fromPlaceholder)

Получение значения из массива modX::placeholders .

cssToHead

Регистрация CSS кода в шапке страницы.

htmlToHead

Регистрация произвольного HTML в шапке страницы.

htmlToBottom

Регистрация произвольного HTML в подвале страницы.

jsToHead

Регистрация JavaScript файла в шапке страницы. Если передать параметром true , то можно регистрировать сразу код.

jsToBottom

Регистрация JavaScript в подвале страницы. Если передать параметром true , то можно регистрировать сразу код.

Для работы функций регистрации скриптов и файлов, на странице должны быть теги head и body .

gettype

Возвращает тип переменной.

Другие модификаторы (функции)

Помимо описанных выше, в Fenom присутствую следующие функции:

PCRE модификаторы

Список модификаторов работающих на Perl Compatible Regular Expressions — библиотеке, которая реализует работу регулярных выражений в стиле Perl (с некоторыми отличиями).

preg_quote

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

preg_match

Выполняет проверку на соответствие регулярному выражению.

Например, выведем email если соответствует регулярному выражению:

preg_get

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

Например, получим первое изображение из поля content :

preg_get_all

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

preg_grep

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

Например, получим только даты:

preg_replace

Выполняет поиск и замену по регулярному выражению.

Например, выведем название сайта без http:

preg_filter

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

Регулярные выражения для чайников

Что такое регулярные выражения?

В народе: регэкспы, регулярки.

По-простому — это выражения для поиска и замены подстроки по шаблону.

В PHP используется название PCRE (Perl Compatible Regular Expressions —
перл совместимые регулярные выражения). В этой статье я постараюсь раскрыть
потенциал это мощного инструмента программиста. Не пытайтесь понять все сразу,
впитывайте порциями и приходите за добавкой.

Начнем

// наша строка для испытаний
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

Если нам нужно просто узнать есть ли шаблон ‘abc’ в строке $string
мы можем набросать такой код:

echo preg_match ( «/abc/» , $string ) ;
?>

Этот код выведет ‘1’. Потому что он нашел 1 (одно) вхождение шаблона в строке.
Если шаблон в строке не обнаружен, preg_match вернет 0. При нахождении первого вхождения,
функция сразу возвращает результат! Дальнейший поиск не продолжается (см. preg_match_all)

Нахождение начала строки

Теперь мы желаем узнать, начинается ли строка с ‘abc’.
Символ начала строки в регулярках — ‘^’ (caret — знак вставки).

// тест на начало строки
if ( preg_match ( «/^abc/» , $string ) )
<
// окей, строка начинается с абс
echo ‘The string begins with abc’ ;
>
else
<
echo ‘это фэйл’ ;
>
?>

Пример выведет:
The string begins with abc

Оборачивающие слэши — разделители, содержат регуряное выражение. Это могут быть любые парные символы,
например @regex@, #regex#, /regex/ и .т.п.

Символ ^ сразу после первого разделителя указывает что выражение начинается сначала строки и НИКАК иначе.

Что делать с регистром символов (строчные-прописные)

Перепишем код, чтобы он искал строку ‘ABC’:

Скрипт вернет:
Не думаю

Все потому что поиск регистро-зависимый. Шаблон ‘abc’ не тоже самое что ‘ABC’.
Чтобы найти оба варианта, нужно использовать модификатор. В регулярных выражениях
для этого применяется модификатор ‘i’, который нужно указать за закрывающим разделителем
регулярного выражения.

if ( preg_match ( «/^ABC/i» , $string ) ) <
echo ‘Совпадение, строка начинается с abc’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Теперь скрипт найдет паттерн ‘abc’. Также теперь будут попадать под шаблон
строки вида abc, ABC, Abc, aBc, и т.п.

Позже будет рассказано подробнее о модификаторах.

Как указать в паттерне конец строки

Делается это также как и в случае с поиском начала строки.
Распространенная ошибка, допускаемя многими прогерами — использование символа $ для указания конца строки в шаблоне.
Это неверно, правильное решение — использовать утверждение \z. Посмотрите на этот код

Сниппет вернет true, потому что $ = \Z, что в свою очередь можно описать выражением (?=\z|\n\z).
Когда нам нужно получить в результате строку без «разделителей строк», $ не должен использоваться.
Также $ совпададет больше одного раза с модификатором /m, в противоположность \z. Изменим немного код,
удалим каретку (^) в начале паттерна и добавим \z в конце, также уберем зависимость от регистра модификатором /i.

// паттерн в конце строки?
if ( preg_match ( «/89 \z /i» , $string ) ) <
echo ‘Совпадение, строка заканчивается на 89’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
>> Совпадение, строка заканчивается на 89

Потому что мы определили конец строки 89. Вот так.

Мета символы

Ранее мы поэкспериментировали с простыми регулярками. Познакомились с кареткой (^) и долларом ($)/
Эти символы имееют особенное значение. Каретка (^) обозначает начало страки и доллар ($) — ее конец.
Такие символы в купе с остальными специальными называются мета символами (meta characters).

Список мета символов в регулярных выражениях:

Разберем все символы на примерах.
Если вам нужно составить шаблон в котором содержится такой символ, его необходимо экранировать (см. preg_quote)
Например шаблон: «1+1», нужно записать как-то так:

// образец
$string = ‘1+1=2’ ;

if ( preg_match ( «/^1 \+ 1/i» , $string ) ) <
// yep
echo ‘The string begins with 1+1’ ;
> else <
// nope
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
The string begins with 1+1

Потому что интерпретатор проигнорировал специальное значение символа «+», обозначенного символом экранирования «\» (бэкслэш).
Если бы мы не добавили экран к плюсу, то preg_match(«/^1+1/i», $string) не нашло бы совпадений с шаблоном.
Сам бэкслэш в свою очередь тоже нужно экранировать, если мы ищем именно этот символ «\\».

Что означают остальные мета символы

Квадратные скобки [ ] обозначают «строковой класс».

Символьный класс. Это просто набор символов, которые должны совпасть в искомой строке.
Они могут записываться индивидуально (по одному):

Или как диапазон, разделенный символом «-«:

// Ищем шаблон
echo preg_match ( «/b[aoiu]g/» , $string , $matches ) ;

Результат скрипта:
return 1

Потому что preg_match() нашел совпадение.
Этот код также найдет совпадение со строками ‘bag’ ‘bog’ ‘big’, но не с ‘beg’.
Диапазон символов [a-f] равнозначен такой записи [abcdef]. Словами формулируется так [от ‘a’ до ‘f’].
Еще раз повторю, выражения регистрозависимые, и [A-F] не тоже самое что и [a-f].

Мета символы не работыют внутри классов, поэтому их не нужно экранировать внутри квадратных скобок [. ].
Например класс [abcdef$] совпадет с символами a b c d e f $. Доллар ($) внутри класса — это простой бакс знак доллара без какого либо специального мета-свойства.

Есть правда исключения из правил:
Одна из полезных функций регулярных выражений — возможность указать шаблон НЕ совпадающий с диапазоном символов.
Чтобы это сделать, нужно использовать каретку (^) первым символом класса.
Найдем любые символы, кроме «b»:

// осуществляем поиск
preg_match ( «/[^b]/» , $string , $matches ) ;

// выведем все совпадения в цикле foreach
foreach ( $matches as $key => $value ) <
echo $key . ‘ -> ‘ . $value ;
>
?>

Результат скрипта:
0 -> a

Здесь preg_match() нашел первое совпадение с шаблоном /[^b]/.
Изменим скрипт и используем preg_match_all() для нахождения всех вхождений соответствующих шаблону /[^b]/.

// ищем ВСЕ совпадения
preg_match_all ( «/[^b]/» , $string , $matches ) ;

// выведем все совпадения в цикле foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
acefghijklmnopqrstuvwxyz0123456789

Выведет все символы, которые НЕ совпадают с шаблоном «b».

Так мы можем отфильтровать все цифры в строке:

// все символы не являющиеся цифрами от 0 до 9
preg_match_all ( «/[^0-9]/» , $string , $matches ) ;

foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz

Шаблон [^0-9] расшифровывается как все НЕ включая цифры от 0 до 9.

Продолжаете слушать нашу радиостанцию?
Тогда продолжим.

Метасимвол Бэкслэш (\).

Основное значение — экранирование других метасимволов.

// create a string
$string = ‘This is a [templateVar]’ ;

// try to match our pattern
preg_match_all ( «/[ \[ \] ]/» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Здесь мы хотели найти все символы []. Без экранирования шаблон выглядел бы так — «/[[]]/»,
но мы добавили бэеслэши к скобкам [], чтобы отменить их мета-статус.
Также, к примеру, поступим с путем к файлу.
c:\dir\file.php
В паттерне будем использовать разделитель «\\».

Бэкслэш также ортодоксально используется в строках для указания специальных последовательностей: \n, \r и др.

Еще он неймспейсы разделяет!

Следующий символ «.» (точка) ака «полный стоп».

`Точка` совпадает с любым символом кроме символов разрыва строки \r или \n.
С помощью точки мы можем найти любой одиночный символ, за исключением разрыва строки.
Чтобы точка также совпадала с переводом каретки и разрывом строки, можно использовать флаг /s.

Ищем одиночный символ

$string = ‘sex at noon taxes’ ;

echo preg_match ( «/s.x/» , $string , $matches ) ;
?>

Результат скрипта:
1

Да, да preg_match() нашел одно совпадение. Пример также сработает с sax, six, sox, sux, и s x, но не совпадет с «stix».

Теперь попробуем найти \n.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// echo the string
echo nl2br ( $string ) ;

// look for a match
echo preg_match_all ( «/ \s /» , $string , $matches ) ;

Результат скрипта:
sex
at
noon
taxes
4

preg_match_all() нашел 4 совпадения разрыва строки «\n» потому что мы использовали флаг \s. Подробнее про флаге в разделе Спец Последовательностей..

Следующий волшебный символ — звездочка (*) asterisk
Совпадает с НОЛем и/или БОЛЕЕ вхождений шаблона, находящегося перед звездочкой.
* означает опциональный шаблон — допускается что символы могут быть, а могут и отсутствовать в строке.
Так шаблон .* совпадает с любым количеством любых символов. Пример:

// create a string
$string = ‘php’ ;

// look for a match
echo preg_match ( «/ph*p/» , $string , $matches ) ;

Результат скрипта:
1

Нашлось одно совпадение. В примере это один символ «h».
Пример также совпадет также со строкой «pp» (ноль символов «h»), и «phhhp» (три символа «h»).

Добрались до мета символа символа «+»

Плюс почти тоже самое что и звездочка, за исключением того что плюс совпадает с ОДНИМ и БОЛЬШЕ символом.
Так в примере звездочка «*» совпала со строкой ‘pp’, с плюсом «+» такое не пройдет.

// create a string
$string = ‘pp’ ;

// look for a match
echo preg_match ( «/ph+p/» , $string , $matches ) ;

Результат скрипта:

Потому что ни одного символа «h».

Следубщий пациент
Мета символ «?»

Знак вопроса совпадет с НУЛЕМ или ОДНИМ вхождением символа или регулярным выражением,
указанным сразу перед ним. Полезен для указания опциональных символов (которых может и не быть).

Например, телефонный номер в Австралии: 1234-5678.

// create a string
$string = ‘12345678’ ;


// look for a match
echo preg_match ( «/1234-?5678/» , $string , $matches ) ;

Результат скрипта:
1

Потому что -? совпал 0 раз с символом «-«. Изменение строки на «1234-5678» выдаст тот же результат.

Фигурные скобки <>

Указывает на количество совпавших символов или их интервал.
Например, за фразой PHP должно следовать ТОЧНО ТРИ цифры:

// create a string
$string = ‘PHP123’ ;

// look for a match
echo preg_match ( «/PHP[0-9]<3>/» , $string , $matches ) ;

Результат скрипта:
1

Шаблон PHP 0-9(цифры от 0 до 9) <3>(три раза) совпал.

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

Бэкслэш (\) используется для спец. последовательностей:

* \d — любая цифра (тоже самое что и [0-9])
* \D — любая НЕ цифра ([^0-9])
* \s — все «недосимволы» — пробелы, переводы строки, табуляция ([ \t\n\r\f\v])
* \S — все НЕ «недосимволы» ([^ \t\n\r\f\v])
* \w — все альфа-цифровые символы (буквенно-числовые) ([a-zA-Z0-9_])
* \W — все НЕ альфа-цифровые символы ([^a-zA-Z0-9_])

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

// match our pattern containing a special sequence
preg_match_all ( «/[ \w ]/» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz0123456789

Мы нашли (preg_match_all) все цифры и буквы (\w) класса ( [] ).

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

// create a string
$string = ‘2 bad for perl’ ;

// echo our string
if ( preg_match ( «/^ \d /» , $string ) ) <
echo ‘String begins with a number’ ;
> else <
echo ‘String does not begin with a number’ ;
>
?>

Метасимвол «.» (Точка, полный стоп)

Совпадает один раз с любым символом (кроме разрыва строки)

// create a string
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

// try to match any character
if ( preg_match ( «/./» , $string ) ) <
echo ‘The string contains at least on character’ ;
> else <
echo ‘String does not contain anything’ ;
>
?>

Результат скрипта:
The string contains at least on character

Конечно, код содержит хотябы один символ.

Ранее была рассмотрена проблема нахождения символа разрыва строки, потому что «.» не совпадает с таким символом (\n).
Здесь нам на помощь придет флаг \s. Он найдет любой пробельный символ (недосимвол).

Для примера используем \n.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// echo the string
echo nl2br ( $string ) ;

// look for a match
echo preg_match_all ( «/ \s /» , $string , $matches ) ;

Результат скрипта:
sex
at
noon
taxes
4

preg_match() нашел 4 совпадения перевода строки \n.

Теперь все вместе, хором

Более сложные выражения.
Рассмотрим оператор OR (ИЛИ).
В регулярных выражениях это символ «|» (труба, канал).

Настало время показательного «Hello World» скрипта.

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns This OR That OR There
echo preg_match ( «/^(This|That|There)/» , $string ) ;
?>

Усложним задачу: попытаемся найти одновременно Hello или Jello в строке.

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns Jello or Hello
if ( ! preg_match ( «/(Je|He)llo/» , $string ) ) <
echo ‘Pattern not found’ ;
> else <
echo ‘pattern found’ ;
>
?>

Хотя шаблон совпал, мы не видим какую имеено сроку мы нашли.
Для возвращения найденных результатов в preg_match добавляется третий параметр (&$matches):

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns Jello or Hello
// put the matches in a variable called matches
preg_match ( «/(Je|He)llo/» , $string , $matches ) ;

// loop through the array of matches and print them
foreach ( $matches as $key => $value ) <
echo $key . ‘->’ . $value . ‘
‘ ;
>
?>

Элемент массив $matches[0] содержит всю совпавшую подстроку (всегда), в примере — Hello.
Последующие элементы содержат последовательно вхождения субпаттернов «()».
$matches[1] совпадает с первым субпатерном. В примере — (Je|He)

Модификаторы и утверждения

Модификаторы изменяют поведения шаблонов регулярных выражений.

i — регистронезависимый (Ignore Case, case insensitive)
U — нежадный поиск (Make search ungreedy)
s — включая перевод строки (Includes New line)
m — мультистрока (Multiple lines)
x — Extended for comments and whitespace
e — Enables evaluation of replacement as PHP code. (preg_replace only)
S — Extra analysis of pattern

b — граница слова (Word Boundry)
B — НЕ граница слова (Not a word boundary)
A — начало шаблона (Start of subject)
Z — конец шаблона или разрыв строки (End of subject or newline at end)
z — конец шаблона (End of subject)
G — первая совпавшая позиция в шаблоне (First matching position in subject)
?>

Простой пример модификатора «i»

// create a string
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

// try to match our pattern
if ( preg_match ( «/^ABC/i» , $string ) ) <
echo ‘Совпадение, строка начинается с abc’ ;
> else <
echo ‘Не думаю’ ;
>
?>
?>

Использование модификатора «s»

/*** create a string with new line characters ***/
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

/*** look for a match */
echo preg_match ( «/sex.at.noon/» , $string , $matches ) ;

Результат скрипта:

«.» не находит символы разрыва строки, добавим модификатор «s»
чтобы это исправить

/*** create a string with new line characters ***/
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

/*** look for a match using s modifier ***/
echo preg_match ( «/sex.at.noon/s» , $string , $matches ) ;
?>
?>

Результат скрипта:
1

Разрывы строк позволяют нам использовать модификатор «m».
Это улично-магический модификатор. Он принимает строку за однострочнкую с символом разрыва на конце,
даже если в строке на самом деле больше символов разрыва (мультистрока).
Т.е. если в строке нет символов разрыва строк, этот модификатор ничего не значит.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// look for a match
if ( preg_match ( «/^noon/im» , $string ) ) <
echo ‘Pattern Found’ ;
> else <
echo ‘Pattern not found’ ;
>
?>

Результат скрипта:
Pattern Found

Конечно регулярное выражение найдет совпадение.
Все что следует после первого символа разрыва строки отбрасывается из-за модификатора «m».

В примере используюся вместе модификаторы «i» и «m», их действие комбинируется.

«x» модификатор позволяет составлять регулярное выражение на нескольких строках,
что повышает его читабельность и позволяет добавлять комментарии внутри шаблона.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// create our regex using comments and store the regex
// in a variable to be used with preg_match
$regex = ‘
/ # opening double quote
^ # caret means beginning of the string
noon # the pattern to match
/imx
‘ ;

// look for a match
if ( preg_match ( $regex , $string ) ) <
echo ‘Pattern Found’ ;
> else <
echo ‘Pattern not found’ ;
>
?>

Код в пояснениях не нуждается, он просто демонстрирует как можно вставить комментарии и
написать выражение в несколько строк.

Модификатор «e»

Спец млжификатор, который изменяет выполнение сопоставления шаблону. Ниже будет выделена целая секция для его описания.

Модификатор «S»

Этот модификатор позволяет нам проанализировать строку до сопостовления с шаблонами,
которые не помечены якорями. Т.е. если шаблон не имеет начальной фиксированой позиции, как например:

Паттерн может успорить выполение шаблона в случае с множественными совпадениями.
В следующем примере появляется множественное вхождение шаблона, поэтому добавим «S».

// match our pattern containing a special sequence
preg_match_all ( «/[ \w ]/S» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz01234567890

На практике модификатор используется достаточно редко.

Модификатор границы слова (word boundary) «\b»

Граница слова создается между двух «\b» модификаторов.
Это специальный «подпирающий тип модификаторов, которые позволяют указть ТОЧНОЕ совпадение.
Текст должен совпасть только с точным шаблоном заключенным в «\b»
Например, шаблон «cat» не совпадет с «catalog».

$string = ‘eregi will not be available in PHP 6’ ;

// ищем строку «lab»
if ( preg_match ( «/ \b lab \b /i» , $string ) ) <
// Совпадение
echo $string ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Не думаю

Мы пытаемся найти совпадение с паттерном «lab», которое находится внутри строки в слове «available».
Из за использования границ слов, шаблон не совпал с подстрокой.
Давайте попробуем пример, не используя модификатора границ слов.

$string = ‘eregi will remain in the computer lab’ ;

// ищем строку «lab»
if ( preg_match ( «/ \b lab \b /i» , $string ) ) <
// Совпадение
echo $string ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
eregi will remain in the computer lab

Мы видим что совпадение произошло с целым словом «lab». (\blab\b).

Модификатор \B

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

$string = ‘This lathe turns wood.’ ;

// match word boundary and non-word boundary
if ( preg_match ( «/ \B the \b /» , $string ) ) <
echo ‘Совпал шаблон «the».’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
>> Совпал шаблон «the».

Этот код сначала найдет паттерн «the». Потому что сначала указан модификатор «не граница слова»,
the находится внутри фразы и не снача ее, затем модификатор \b границы указывает что фраза должна
закончится на -the.

$string = ‘The quick brown fox jumps over the lazy dog.’ ;

// match word boundary and non-word boundary
if ( preg_match ( «/ \B the \b /» , $string ) ) <
echo ‘Совпал шаблон «the».’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Не думаю

В этот раз мы ничего не нашли, потому что «the» стоит на границе слова, а мы использовали модификатор \B.

Последний модификатор — \U

По умолчанию, PCRE «жадный» — это не значит что они съедят вашу печеньку,
а означает что шаблон совпадет с наибольшим возможным количеством символов,
попадающих под этот шаблон.

Чтобы отключить такую «жадность» регулярных выражений
— используем ограничитель «?», например «(.*?)»
— используем модификатор «\U».

Новичкам желательно использовать этот модификатор по-умолчанию, чтобы не возникало конфузов.

$string = ‘foobar foo—bar fubar’ ;

// try to match the pattern
if ( preg_match ( «/foo(.*)bar/U» , $string ) ) <
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>

Результат скрипта:
Совпадение

Другой пример — дан кусок html

Попытаемся найти все ссылки выражением preg_match_all(«/.*/s», $string),
код вернет всю искомую строку вместо трех ссылок. Добавив Нежадный модификатор, все три ссылки поотдельности.

Вычисление с preg_replace

Приветствуем на сцене модификатор «e».

Этот модификатор вычисляет заменяемый аргумент.
До этого мы не рассматривали preg_replace(), поэтому быстрый пример:

$string = ‘We will replace the word foo’ ;

// заменяем `for` на `bar`
$string = preg_replace ( «/foo/» , ‘bar’ , $string ) ;

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

// строка с шаблонными переменными
$string = ‘This is the <_foo_>bought to you by <_bar_>‘ ;

// создади массив со значениями переменных
$templateVars = [ «FOO» => «The PHP Way» , «BAR» => «PHPro.orG» ] ;

// заменяем и вычисляем
$string = preg_replace ( «/<_(.*?)_>/ime» , » \$ templateVars[‘$1’]» , $string ) ;

Без модификатора «е» скрипты выдаст результат:
This is a $template_vars[FOO] and this is a $template_vars[BAR]

С модификатором переменные вычислятся после замены:
This is the The PHP Way bought to you by PHPro.orG

Таким образом, модификатор «e» обладает потенциалом встроенного шаблонизатора.

Заглядывание вперед (Look Aheads)

Возможность регулярных выражений «заглянуть вперед» шаблона для определения дальнейших совпадений.
«Подглядывание вперед» бывает положительное и отрицательное

Рассмотрим сначала заглядывание вперед с отрицанием. Обозначается в шаблоне символами «?!».
Полезно при поиске шаблона, стоящего впереди от совпадения, которое нам нужно.

$string = ‘I live in the whitehouse’ ;

// try to match white not followed by house
if ( preg_match ( «/white+(?!house)/i» , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
No match is found

Потому что слово «white» следует за словом «house».
Подадим блюдо под другим соусом:

$string = ‘I live in the white house’ ;

// try to match white not followed by house
if ( preg_match ( «/white+(?!house)/i» , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Совпадение

Есть совпадение, потому что слово «white» не следует сразу же за словом «house» (как в «whitehouse»)

Позитивное/положительное заглядывание вперед «?=»

$string = ‘This is an example eg: foo’ ;

// try to match eg followed by a colon
if ( preg_match ( «/eg+(?=:)/» , $string , $match ) ) <
print_r ( $match ) ;
> else <
echo ‘Нет совпадений’ ;
>
?>

Результат скрипта:
Array < [0]=>‘eg’ >

Код ищет паттерн «eg», стоящий перед «:» двоеточием.
Но что если нам нужно найти что-то до двоеточия, например дом из предудыщего примера.
Для этого на помощь приходят «заглядывания назад».

Заглядывание назад (Look Behinds)

Позволяет просмотреть строку назад и определить наличие совпадений с шаблоном.
Также разделяется на положительное и отрицательное.
Положительное — записывается «?

$string = ‘I live in the whitehouse’ ;

// try to match house preceded by white
if ( preg_match ( «/(? , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Совпадение

Здесь мы нашли совпадение, потому что паттерн «house» сразу следует за паттерном «house».
Движок регулярных выражений «посмотрел назад» шаблона «house» и определил совпадение.

Если мы хотим, чтобы «house» НЕ следовал за словом «white»?
Используем отрицительное заглядывание назад — «?

/*** a simple string ***/
$string = ‘I live in the whitehouse’ ;

/*** try to match house preceded by white ***/
if ( preg_match ( «/(? , $string ) )
<
/*** if we find the word white, not followed by house ***/
echo ‘Совпадение’ ;
>
else
<
/*** if no match is found ***/
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
no match is found

Потому что отрицательное заглядывание не нашло шаблона «house» c шаблоном «white» в начале его.
Давайте поменяем цвет «дома», белым слишком девственный для правительственного здания.

$string = ‘I live in the bluehouse’ ;

// ищем `house` с непредшествующим `white`
if ( preg_match ( «/(? , $string ) ) <
/*** if we find the word white, not followed by house ***/
echo ‘Совпадение’ ;
> else <
/*** if no match is found ***/
echo ‘Не думаю’ ;
>
?>

Мы изменили «whitehouse» на «bluehouse» и теперь наша регулярка сработала, потому что
шаблон «white» не обнаружен перед «house».

По-умолчанию регулярки жадные, это значит что квантификаторы (какое слово страшное)
*, +, ? «пожирают» столько символов сколько могут.

/*** 4 x and 4 z chars ***/
$string = «xxxxzzzz» ;

/*** greedy regex ***/
preg_match ( «/^(.*)(z+)$/» , $string , $matches ) ;

/*** results ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Первый паттерн (.*) совпал со всеми четыремя «x» и тремя из четырех символов «z».
Сработала жадность — шаблон забрал столько символов, сколько было в искомой строке.
Проще простого помочь перестать квантификаторам быть жадными, добавив «?» к квантификатору как в примере:

/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*?)(z+)$/» , $string , $matches ) ;

/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Теперь $matches[1] содержит четыре «x» символа и $matches[2] четыре символа «z».
Потому что квантификатор «?» изменил поведение шаблона с «взять как можно БОЛЬШЕ» на «взять как можно МЕНЬШЕ».

Чтобы сделать нежадным весь шаблон, используем модификатор «U».

/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*)(z+)$/U» , $string , $matches ) ;

/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Результат как в предыдущем примере.

Подводные камни c ? и U

Важно заметить, что модификатор «U» не только делает поиск нежадным, он инвертирует поведение жадности квантификатора «?».
Если использовался квантификатор «?» и одновременно модификатор «U», действие «?» будет инвертировано.

/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*?)(z+)$/U» , $string , $matches ) ;


/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Результат скрипта:
xxxxzzz
Delimiters

В этом мане было рассмотрено много регулярок и все они разделялись слэшем «/».
Иногда нам нужно находить в шаблоне слэш и когда он одновременно является разделителем регуляного выражения,
нам придется экранировать каждый встречающийся слэш, что неудобно.

Поэтому в качестве разделителя можно взять любой символ, например #, @, ^ и т.п.

/*** get the host name from a url ***/
preg_match ( ‘#^(?:http://)?([^/]+)#i’ , «http://www.phpro.org/tutorials» , $matches ) ;

/*** show the host name ***/
echo $matches [ 1 ] ;
?>

Примеры

// the string to match against
$string = ‘The cat sat on the mat’ ;

// match the beginning of the string
echo preg_match ( «/^The/» , $string ) ;

// match the end of the string
// returns 1
echo preg_match ( «/mat \z /» , $string ) ;

// match anywhere in the string
// returns 0 as no match was found for dog.
echo preg_match ( «/dog/» , $string ) ;
?>

Поиск нескольких шаблонов

// the string to match against
$string = ‘The cat sat on the matthew’ ;

// matches the letter «a» followed by zero or more «t» characters
echo preg_match ( «/at*/» , $string ) ;

// matches the letter «a» followed by a «t» character that may or may not be present
echo preg_match ( «/at?/» , $string ) ;

// matches the letter «a» followed by one or more «t» characters
echo preg_match ( «/at+/» , $string ) ;

// matches a possible letter «e» followed by one of more «w» characters anchored to the end of the string
echo preg_match ( «/e?w+ \z /» , $string ) ;

// matches the letter «a» followed by exactly two «t» characters
echo preg_match ( «/at<2>/» , $string ) ;

// matches a possible letter «e» followed by exactly two «t» characters
echo preg_match ( «/e?t<2>/» , $string ) ;

// matches a possible letter «a» followed by exactly 2 to 6 «t» chars (att attt atttttt)
echo preg_match ( «/at<2,6>/» , $string ) ;

Запомните, preg_match() возвращает только 0 или 1, и останавливается после первого успешного нахождения шаблона.

Чтобы найти все совпадения — используйте preg_match_all().

Чит Шит

\w — Any “word” character (a-z 0-9 _)
\W — Any non “word” character
\s — Whitespace (space, tab CRLF)
\S — Any non whitepsace character
\d — Digits (0-9)
\D — Any non digit character
. — (Period) – Any character except newline

^ — Start of subject (or line in multiline mode)
$ — End of subject (or line in multiline mode)
[ — Start character class definition
] — End character class definition
| — Alternates, eg (a|b) matches a or b
( — Start subpattern
) — End subpattern
\ — Escape character

n- Zero or more of n
n+ — One or more of n
n? — Zero or one occurrences of n
— n occurrences exactly
— At least n occurrences
— Between n and m occurrences (inclusive)

i — Case Insensitive
m — Multiline mode — ^ and $ match start and end of lines
s — Dotall — . class includes newline
x — Extended– comments and whitespace
e — preg_replace only – enables evaluation of replacement as PHP code
S — Extra analysis of pattern
U — Pattern is ungreedy
u — Pattern is treated as UTF-8

\b — Word boundary
\B — Not a word boundary
\A — Start of subject
\Z — End of subject or newline at end
\z — End of subject
\G — First matching position in subject

(?=) — Positive look ahead assertion foo(?=bar) matches foo when followed by bar
(?!) — Negative look ahead assertion foo(?!bar) matches foo when not followed by bar
(? ) — Once-only subpatterns (?>\d+)bar Performance enhancing when bar not present
(?(x)) — Conditional subpatterns
(?(3)foo|fu)bar — Matches foo if 3rd subpattern has matched, fu if not
(?#) — Comment (?# Pattern does x y or z)

Дополнения от меня

Posix символьные классы

Дополнительные шорткуты для шаблонов. Могут применяться только внутри классов.
Пример для поиска числа с пробелами — preg_match(«@[[:space:]\d]+@», $string)

Внутренние модификаторы шаблонов

Модификаторы m, s, x, U, X, J могут использоваться внутри шаблона.
Например (?im) установит мультистроковой регистронезивисимый метод поиска для паттерна.
Отключить внутренние модификаторы можно перечислив их через дефис, например (?im-sx)

Пример:
шаблон (?i:foo) совпадет с «FoO»

Именованный «захват»

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

Записывается: (? ), (?’name’) или (?P ).
Раньше поддерживался только такой синтаксис: (?P ). [

preg_match ( ‘/Name: (.+), Age: ( \d +)/’ , $text , $matches ) ;
preg_match ( ‘/Name: (?P .+), Age: (?P \d +)/’ , $text , $matches ) ;
?>

Результат скрипта:
array(‘Name’ => ‘строка’, ‘Age’ => ‘число’)

Замена через callback-функцию

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

\s * \w |’ ,
create_function (
‘$matches’ ,
‘return strtoupper($matches[0]);’
) ,
$line
) ;
?>

Данный код заменит все первые буквы в параграфах на заглавные.

В php >= 5.3 callback-функцию можно записать в сокращенном виде

\s * \w |’ ,
function ( $matches ) <
return strtoupper ( $matches [ 0 ] ) ;
> ,
$line
) ;
?>

Команда grep: опции, регулярные выражения и примеры использования

Это справочный материал по утилите grep и регулярным выражениям. Он рассчитан на уже умеющих с ними работать. Если вы совершенно не знакомы с синтаксисом записи регулярных выражений и вам нужна понятная инструкция, то рекомендуется начать знакомство со статьи «Регулярные выражения и команда grep».

Оглавление

Описание программ grep

grep, egrep, fgrep – печатают строки, соответствующие шаблону.

grep ищет по ШАБЛОНУ в каждом ФАЙЛЕ. ФАЙЛ, обозначенный как «» является стандартным вводом. Если ФАЙЛ не дан, рекурсивные поиски исследуют рабочую директорию (если рекурсия указана соответствующей опцией), и нерекурсивные поиски считывают стандартный ввод. По умолчанию, grep печатает совпадающие строчки.

В дополнение вариантами программы являются egrep и fgrep, которые являются тем же самым, что и, соответственно, grep -E и grep -F. Варианты egrep и fgrep являются устаревшими, но работают для обратной совместимости. Вместо устаревших вариантов рекомендуется использовать grep -E и grep –F.

В общей сложности имеется четыре варианта grep, различающиеся поддерживаемыми типами регулярных выражений. Они управляются опциями -G (интерпретирует шаблон как базовое регулярное выражение (BRE) – это поведение по умолчанию), -E (интерпретирует шаблон как расширенное регулярное выражение (ERE)), -F интерпретирует шаблон как список фиксированных строк (вместо регулярных выражений), разделённых новой строчкой, любая из которых должна совпасть и -P интерпретирует образец как совместимое с Perl регулярное выражение (PCRE). Последний вариант является экспериментальным, особенно при сочетании с опцией -z (—null-data). «grep -P» может выдать предупреждение о нереализованных функциях – подробности смотрите в секции Остальные опции.

Вызов программы grep

Программа grep имеет следующие варианты запуска:

Может быть ноль или более ОПЦИЙ. ШАБЛОН будет рассматриваться только как таковой (и не как ФАЙЛ) если он ещё не был указан внутри ОПЦИЙ (использованием опций «-e шаблон» или «-f файл»). Может быть указано ноль или более ФАЙЛОВ.

Справка по команде grep

Опции grep

Рассмотрим подробнее опции команды grep.

Общая информация о программе

—help

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

-V, —version

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

Выбор типа регулярного выражения

-E, —extended-regexp

Интерпретировать ШАБЛОН как расширенное регулярное выражение (ERE, подробности ниже).

-F, —fixed-strings

Интерпретировать ШАБЛОН как список фиксированных строк (вместо регулярных выражений), разделённых символом новой строчки, которые используется для поиска совпадений.

-G, —basic-regexp

Интерпретировать ШАБЛОН как базовое регулярное выражение (BRE, смотрите ниже). Это значение по умолчанию.

-P, —perl-regexp

Интерпретировать ШАБЛОН как совместимое с Perl регулярное выражение (PCRE). Это высоко экспериментальная функция, и grep -P может выводить предупреждение о нереализованных возможностях.

Управление работой регулярных выражений

-e ШАБЛОН, —regexp=ШАБЛОН

Использовать ШАБЛОН как шаблон (образец). Если эта опция используется несколько раз или комбинируется с опцией -f (—file), делается поиск по всем заданным шаблонам. Эта опция может использоваться для защиты шаблона, начинающегося с «»,

-f ФАЙЛ, —file=ФАЙЛ

Получает образцы из ФАЙЛА, один на строку. Если эта опция используется несколько раз или комбинирована с опцией -e (—regexp), то поиск делается по всем заданным шаблонам. Пустой файл содержит ноль образцов и, следовательно, ничему не будет совпадать.

-i, —ignore-case

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

Хотя это просто с буквами когда они различаются только регистром – в парах заглавная-прописная буква, поведение является неопределённым в других ситуациях. Например, заглавная «S» во многих локалях имеет необычную контрпару «ſ» (Unicode символ U+017F, LATIN SMALL LETTER LONG S), и не ясно, является ли этот необычный символ соответствием «S» или «s» даже когда перевод из строчной в заглавную приводит к «S».

Другой пример: маленькая германская буква «ß» U+00DF, LATIN SMALL LETTER SHARP S) обычно при переводе в заглавную превращается в двух символьную строку «SS», но она не соответствует «SS» и она может не соответствовать заглавной букве «ẞ» (U+1E9E, LATIN CAPITAL LETTER SHARP S) хотя перевод последней в строчную даёт предыдущую.

-v, —invert-match

Инвертирует (делает противоположным) смысл поиска соответствий, для выбора не-совпадающих строк.

-w, —word-regexp

Выбрать только строки, содержащее соответствие, которое формирует целые слова. Совпадение засчитывается только если совпадающая подстрока окружена символами начала/окончания строчки или неглавными составными символами. Главными составными символами являются буквы, цифры и знак подчёркивания. Эта опция не имеет эффекта, если также указана -x.

-x, —line-regexp

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

-y

Абсолютный синоним для -i, предоставляется для совместимости.

Управление выводом

-c, —count

Подавляет нормальный вывод; вместо него печатает количество совпавших строк для каждого введённого файла. С опцией -v, —invert-match (смотрите ниже), считает несовпадающие строки.

—color[=КОГДА], —colour[=КОГДА]

Окружает подходящие (не пустые) строки, соответствующие строчки, строчки контекста, имена файлов, номера строк, байтные сдвиги и разделители (для полей и групп контекстных строчек) управляющими последовательностями для отображения их в цвете на терминале. Цвета определены переменной окружения GREP_COLORS и значениями по умолчанию это «ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36», т.е. это полужирный красный для подходящего текста, пурпурный для имён файлов, зелёный для номеров строк, зелёный для байтового сдвига, циан для разделителей, и стандартные цвета терминала для другого. Всё ещё поддерживается устаревшая переменная окружения GREP_COLOR, но её настройки не имеют приоритета; её значением по умолчанию является «01;31» (полужирный красный) который охватывает только цвет для совпадающего текста. КОГДА может иметь значение never, always или auto.

-L, —files-without-match

Подавляет нормальный вывод; вместо него печатает имя каждого файла, в котором не найдено ни одного совпадения (по умолчанию эти файлы бы не дали никакого вывода). Сканирование (конкретного файла) остановится при первом совпадении.

-l, —files-with-matches

Подавляет нормальный вывод; вместо него печатает имя для каждого файла ввода, в котором найдено совпадение. Сканирование (конкретного файла) остановится при первом найденном совпадении.

-m ЧИСЛО, —max-count=ЧИСЛО

Остановить чтение файла после ЧИСЛА совпадающих строк. Если вводом является стандартный ввод из регулярного файла, и выведено ЧИСЛО совпадающих строк, перед выходом grep убеждается, что стандартный ввод указывает на место сразу после последней совпавшей строки, независимо от наличия идущих сзади контекстных строк. Это даёт возможность вызывающему процессу возобновить поиск. Например, следующий шелл скрипт использует это:

Но следующий вероятно не будет работать, поскольку труба не является регулярным файлом:

Когда grep останавливается после ЧИСЛА совпавших строк, он выводит идущие сзади контекстные строки. Поскольку контекст не включает совпадающие строки, grep остановится, когда встретит другую совпадающую строку. Когда также используется опция -c или —count, grep не выводит счётчик выше чем ЧИСЛО. Когда также используется опция -v или —invert-match, grep останавливается после вывода ЧИСЛА несовпадающих строк.

-o, —only-matching

Печатает только совпадающие (не пустые) части совпавшей строки, по каждой такой части на отдельной строчке. Выведенные строки используют тот же разделитель, что и ввод, и разделители являются null-байтами, если также используется -z (—null-data) (смотри секцию Остальные опции).

-q, —quiet, —silent

Тишина; не писать что-либо в стандартный вывод. Выход немедленно со статусом ноль, если найдено любое совпадение, даже если была обнаружена ошибка. Также смотрите опции -s или —no-messages.

-s, —no-messages

Подавляет сообщения об ошибках о несуществующих или нечитаемых файлах.

Управление префиксом выходной строки

-b, —byte-offset

Печатает 0-байтное смещение внутри файла ввода перед каждой строкой вывода. Если указана -o (—only-matching), печатает смещение самой совпадающей части. Когда grep запущена на MS-DOS или MS-Windows, выводимый байтовый сдвиг зависит от использования опции -u (—unix-byte-offsets); смотрите ниже.

-H, —with-filename

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

-h, —no-filename

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

—label=МЕТКА

Показывает ввод, в действительности пришедший из стандартного ввода, как пришедший из файла МЕТКА. Это особенно полезно когда выполняются инструменты вроде zgrep, к примеру, что-то вроде:

Также смотрите опцию -H.

-n, —line-number

Предваряет каждую строку вывода номером строки из файла ввода.

-T, —initial-tab

Убедитесь, что первый символ фактического содержимого строки расположен на табуляции, чтобы выравнивание табуляций выглядело нормально. Это полезно с опциями, которые добавляют префикс к их фактическому содержимому: -H,-n и -b. Чтобы увеличить вероятность того, что строки из одного файла будут все начинаться с той же колонки, номера строки и байтового сдвига (если есть) будут выведены на поле минимальной ширены.

-u, —unix-byte-offsets

Печатать вместе с строками вывода смещение в байтах в стиле Unix. Этот переключатель приводит к тому, что grep выводит байтовое смещение так, как если бы это был текстовый файл в стиле Unix, т.е. с обрезанными символами CR. Это произведёт результат идентичный запуску grep на Unix машине. Эта опция не имеет эффекта, если также не используется опция -b; она не имеет эффекта на платформах отличных от MS-DOS и MS-Windows.

-Z, —null

Вывод нулевого байта (символа ASCII NUL) вместо символа, который обычно следует за именем файла. Например grep -lZ выводит нулевой байт после каждого имени файла вместо обычной новой строки. Эта опция делает вывод недвусмысленным, даже в присутствии имени файлов необычных символов вроде новой строки, вроде новой строки. Эта опция может использоваться с командами вроде find -print0, perl -0, sort -z и xargs -0 для обработки произвольных файловых имён, даже тех, которые содержат символы новой строки.

Управление контекстными строками

Контекстные строки – это не совпавшие строки, которые находятся около совпавшей строки. Они выводятся только если используется одна из следующих опций. Независимо как эти опции установлены, grep никогда не выводит любую заданную строку более чем единожды. Если указана опция -o (—only-matching), эти опции не имеют эффект и во время их использования будет дано предупреждение.

-A ЧИСЛО, —after-context=ЧИСЛО

Печатает ЧИСЛО строк последующего контекста после совпадающих строк. Размещает строку, содержащую разделитель (), между смежными группами соответствий. С опцией -o или —only-matching это не имеет эффекта и выдаётся предупреждение.

-B ЧИСЛО, —before-context=ЧИСЛО

Печатает ЧИСЛО строк предшествующего контекста перед совпавшей строкой. Помещает строку, содержащую разделитель () между смежными группами соответствий. С опцией -o или —only-matching это не имеет эффекта и выдаётся предупреждение.

-C ЧИСЛО, -ЧИСЛО, —context=ЧИСЛО

Печатает ЧИСЛО строк предшествующего и последующего контекста после совпадающих строк. Помещает строку, содержащую разделитель () между смежными группами соответствий. С опцией -o или —only-matching это не имеет эффекта и выдаётся предупреждение.

Выбор файлов и директорий

-a, —text

Обрабатывать бинарный файл будто бы это текстовый; это эквивалент опции —binary-files=text.

—binary-files=ТИП

Если данные файла или метаданные говорят о том, что файл содержит бинарную информацию, предполагается, что это файл типа ТИП. Не-текстовые байты говорят о бинарных данных; это либо вывод байтов, которые неправильно кодированы для текущей локали (смотрите Переменные окружения), или null-байты ввода, когда указана опция -z (—null-data) (смотрите Остальные опции).

По умолчанию ТИП это «binary», и когда grep обнаруживает, что файл является бинарным, она подавляет любой последующий вывод и вместо этого выводит либо сообщение в одну строку, говорящее о совпадениях бинарного файла, или сообщение, что совпадений нет.

Если ТИП это «without-match», когда grep обнаруживает, что файл является бинарным, то программа предполагает, что оставшаяся часть файла не совпадает; это эквивалент опции -I.

Если ТИП это «text», grep обрабатывает бинарный файл так, как если бы он был текстовым; это эквивалент опции -a.

Когда ТИП это «binary», grep может обрабатывать не-текстовые байты как разделители строк, даже без опции -z (—null-data). Это означает, что выбор «binary» или «text» может определить, будут ли в файле совпадения шаблону. Например, когда ТИП это «binary» шаблон «q$» может соответствовать «q» за которым сразу идёт null-байт, даже хотя это не соответствует, когда ТИП является «text». Наоборот, когда ТИП это «binary», шаблон «.» (точка) может не соответствовать null-байту.

Предупреждение: опция -a (—binary-files=text) может выводить бинарный мусор, который может иметь неприятные сторонние эффекты если вывод делается в терминал и если терминальный драйвер интерпретирует некоторую его часть как команды. С другой стороны, при чтении файлов, чья кодировка неизвестна, может быть полезно использовать -a или установить в окружении LC_ALL=’C’ чтобы найти больше соответствий даже если совпадения небезопасны для непосредственного отображения.

-D ДЕЙСТВИЕ, —devices=ДЕЙСТВИЕ

Если файлом ввода является устройство, FIFO или сокет, использовать ДЕЙСТВИЕ для его обработки. По умолчанию, ДЕЙСТВИЕ – это «read», что означает, что устройства читаются как если бы они были обычными файлами. Если ДЕЙСТВИЕ это «skip», устройства тихо пропускаются.

-d ДЕЙСТВИЕ, —directories=ДЕЙСТВИЕ

Если файл ввода является директорией, использовать ДЕЙСТВИЕ для его обработки. По умолчанию ДЕЙСТВИЕ это «read», т.е. читать директории как если бы они были обычными файлами. Если ДЕЙСТВИЕ это «skip», тихо пропускать директории. Если ACTION это «recurse», то рекурсивно считывать все файлы в каждой директории, следовать символическим ссылкам только если они в командной строке и пропускать если они встретились рекурсивно. Это эквивалент опции -r.

—exclude=Ф_ШАБЛОН

Пропустить любой файл командной строки с суффиксом имени, который соответствует образцу Ф_ШАБЛОН, в котором можно использовать подстановочные символы; суффикс имени – это либо всё имя, либо любой суффикс начинающийся после / и перед +non-/. При рекурсивном поиске, пропускать любые субфайлы, чьё имя соответствует Ф_ШАБЛОН; базовое имя – это часть после последнего /. Шаблон может использовать в качестве подстановочных символов *, ? и […], и \ для передачи подстановочных символов или обратных слешей в качестве буквальных символов.

—exclude-from=ФАЙЛ

Пропустить файлы, чьё базовое имя соответствует любому из Ф_ШАБЛОНОВ, считанных из ФАЙЛА (использование подстановочных символов соответствует описанному для опции —exclude).

—exclude-dir= Ф_ШАБЛОН

Пропускать любую директорию командной строки с суффиксом имени, который соответствует образцу Ф_ШАБЛОН. При рекурсивном поиске, пропускать любую субдиректорию, чьё базовое имя соответствует Ф_ШАБЛОН. Игнорировать любые избыточные конечные слеши в Ф_ШАБЛОНЕ.

-I

Обрабатывать бинарный файл, как если бы он не содержал подходящих данных; это эквивалент опции —binary-files=without-match.

—include=Ф_ШАБЛОН

Искать только в файлах, чьё базовое имя соответствует Ф_ШАБЛОН (использование подстановочных символов соответствует описанному для опции —exclude).

-r, —recursive

Рекурсивно считывать все файлы в каждой директории, следуя символьным ссылкам только если они в командной строке и пропускать, если они встретились рекурсивно. Помните, если не дан файловый операнд, grep ищет по рабочей директории. Это эквивалент опции -d recurse.

-R, —dereference-recursive

Рекурсивно считывать все файлы в каждой директории. В отличие от -r следовать всем символическим ссылкам.

Остальные опции

—line-buffered

Использовать буферизацию строк. Это может ухудшить производительность.

-U, —binary

Обрабатывать файл(ы) как бинарный. По умолчанию, в MS-DOS и MS-Windows grep угадывает, является ли файл текстовым или бинарным как это описано в разделе опции —binary-files. Если grep решает, что файл является текстовым файлом, программа из оригинального содержимого файла отбрасывает символы CR (чтобы регулярные выражения с ^ и $ правильно работали). Указание -U аннулирует правило догадки, приводя к тому, что все файлы считываются и передаются к буквальному механизму поиска совпадений; если файл является текстовым с парами CR/LF на конце каждой строки это приведёт к неудачи некоторых регулярных выражений. Эта опция не имеет эффекта на платформах отличных от MS-DOS и MS-Windows.

-z, —null-data


Трактовать данные ввода и вывода как последовательность строк, каждая вместо символа «новая строка» отделяется нулевым байтом (символ ASCII NUL). Как опция -Z или —null, эта опция может использоваться с командами вроде sort -z для обработки произвольных имён файлов.

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

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

Программа grep понимает три различных типа синтаксисов регулярных выражений: «basic» (BRE), «extended» (ERE) и «perl» (PCRE). В GNU grep нет разницы в доступной функциональности между базовым «basic» и расширенным синтаксисами «extended». В других реализациях, базовые регулярные выражения менее мощные. Последующее описание применимо к расширенным регулярным выражениям; отличия для базовых регулярных выражений подытожены в конце. Совместимые с Perl регулярные выражения дают дополнительную функциональность, они документированы в pcresyntax(3) и pcrepattern(3), но работают только если в системе доступен PCRE.

Фундаментальная структура

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

Точка . соответствует любому единичному символу.

Пустое регулярное выражение соответствует пустой строке.

Классы символов и Выражения в квадратных скобках

Выражение в квадратных скобках – это набор символов, заключённых в [ и ]. Оно совпадает с любым единичным символом в этом списке; если первым символом этого списка является каретка ^, то оно совпадает с любым символом, не из этого списка. Например, следующее регулярное выражение совпадает с любой единичной цифрой [0123456789]

Внутри квадратных скобок выражение диапазона состоит из двух символов, разделённых тире. Этот диапазон совпадает с любым символом, который сортируется между этими двумя символами (с использованием последовательности сортировки локали и набора символов), включая их самих. Например, в C локали по умолчанию [a-d] эквивалентно [abcd]. Многие локали сортируют символы в словарном порядке, и в этих локалях [a-d] обычно не эквивалентно [abcd]; это может быть, к примеру, эквивалентом [aBbCcDd]. Для получения традиционной интерпретации выражений в квадратных скобках вы можете использовать C локаль установив переменную окружения LC_ALL на значение C.

Наконец, определённые именованные классы символов предопределены внутри выражений в квадратных скобках как показано ниже. Их интерпретация зависит от LC_CTYPE локали; например, «[[:alnum:]]» означает класс символов из чисел и букв в текущей локали.

[:alnum:]

Алфавитные символы: «[:alpha:]» и «[:digit:]»; в локали «C» и кодировке символов ASCII, это то же самое что и «[0-9A-Za-z]».

[:alpha:]

Алфавитные символы: «[:lower:]» и «[:upper:]»; в локали «C» и кодировке символов ASCII, это то же самое что и «[A-Za-z]».

[:blank:]

Пустые символы: пробел и табуляция.

[:cntrl:]

Управляющие символы. В ASCII эти символы имеют восьмеричные коды от 000 до 037 и 177 (DEL). В других наборах символов это эквивалентные символы, если они есть.

[:digit:]

Цифры: 0 1 2 3 4 5 6 7 8 9.

[:graph:]

Графические символы: «[:alnum:]» и «[:punct:]».

[:lower:]

Буквы в нижнем регистре, в локали «C» и кодировке символов ASCII это a b c d e f g h i j k l m n o p q r s t u v w x y z.

[:print:]

Печатные символы: «[:alnum:]», «[:punct:]», и пробел.

[:punct:]

Пунктуационные символы; в локали «C» и кодировке символов ASCII, это ! » # $ % & ‘ ( ) * + , — . / : ; ? @ [ \ ] ^ _ `

[:space:]

Пробельные символы: в локали «C», это табуляция, новая строка, вертикальная табуляция, разрыв страницы, возврат каретки и пробел. Смотрите раздел Использование grep для дополнительной информации о совпадении новой строки.

[:upper:]

Буквы в верхнем регистре: в локали «C» и кодировке символов ASCII, это A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.

[:xdigit:]

Шестнадцатеричные цифры: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.

Обратите внимание, что квадратные скобки в этих классах имён являются частью символических имён и должны быть включены в дополнение к квадратным скобкам, отделяющим выражения в квадратных скобках.

Большинство метасимволов теряют их специальное значение внутри выражений в квадратных скобках. Для включения буквального ] разместите его первым в списке. Аналогично литерал ^ разместите где-угодно, но только не первым. Наконец, для включения литерала разместите его последним.

если не является первым пунктом, завершает выражение в квадратных скобках. Поэтому если вы хотите сделать символ «]» элементом списка, вы должны поставить его в начало.

обозначает открывающий символ сортировки

обозначает закрывающий символ сортировки

представляет открытие класса эквивалентности.

представляет закрытие класса эквивалентности.

представляет открывающий символ класса символов, за ним должно следовать действительное имя класса символов.

представляет закрывающий символ класса символов.

представляет диапазон если не является первым или последним в списке или конечной точкой диапазона.

представляет символы не включаемые в список. Если вы хотите сделать символ ^ элементом списка, разместите её где-угодно кроме первой позиции.

Анкоры

Каретка ^ и знак доллара $ являются метасимволами, которые представляют, соответственно, начало и конец строки. Они называются анкорами (буквально «якоря»), поскольку принудительно «якорят» совпадение, соответственно, к началу или концу строки.

Символы с обратным слешем и Специальные выражения

Символ \, когда за ним следует определённые обычные символы, принимает специальное значение:

\b

Обозначает край слова.

\B

Обозначает не край слова.

Обозначает конец слова.

\w

Обозначает главные составные символы, это синоним для «[_[:alnum:]]».

\W

Обозначает не главные составные символы, это синоним для «[^_[:alnum:]]».

\s

Обозначает белые пробелы, это синоним для «[[:space:]]».

\S

Обозначает не белые пробелы, это синоним для «[^[:space:]]».

Например, «\brat\b» совпадает с отделённым словом «rat», «\Brat\B» совпадает с «crate», но не с «furry rat».

Повторения

За регулярным выражением может следовать один или несколько операторов повторения:

Предыдущий элемент опциональный (встречается ноль или один раз).

Предыдущий элемент встречается ноль или более раз.

Предыдущий элемент встречается один или более раз

Предыдущий элемент встречается ровно n раз.

Предыдущий элемент встречается n или более раз.

Предыдущий элемент встречается не более m раз.

Предыдущий элемент встречается по крайней мере n раз, но не более чем m раз.

Объединение регулярных выражений

Два регулярных выражения могут быть объединены; результирующее регулярное выражение соответствует любой строке, сформированной объединением двух подстрок, каждая из которых соответственно соответствует двум объединённым выражениям.

Альтернативы в регулярных выражениях

Два регулярных выражения могут быть объединены оператором |

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

Приоритет

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

Обратные ссылки и Подвыражения

Обратная ссылка \n, где n это единичная цифра, соответствует подстроке, совпавшей ранее с n-ным подвыражением регулярного выражения, заключённым в круглые скобки. Например, «(a)\1» соответствует «aa». Когда используется альтернатива, если группа не принимает участие в совпадении, то обратная ссылка делает всё совпадение неудавшимся. Например, «a(.)|b\1» не будет соответствовать «ba». Когда с опцией -e или из файла («-f file») дано несколько регулярных выражений, обратная ссылка является локальной для каждого выражения.

Базовые и расширенные регулярные выражения

Переменные окружения grep

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

Локаль для категории LC_foo определяется исследованием трёх переменных окружения LC_ALL, LC_foo, LANG в этом самом порядке. Первая из этих установленных переменных определяет локаль. Например, если LC_ALL не установлена, а LC_MESSAGES установлена на pt_BR, то для категории LC_MESSAGES используется локаль Brazilian Portuguese. Локаль C используется если ни одна из этих переменных окружения не установлена, если каталог локали не установлен или если grep не была скомпилирована с поддержкой национальных языков (NLS). Команда оболочки

выводит список доступных в данный момент локалей.

Многие из последующих переменных позволяют вам контролировать подсветку используя терминалом или эмулятором терминала командный интерпретатор Select Graphic Rendition (SGR). Смотрите раздел Select Graphic Rendition (SGR) в документации используемого текстового терминала чтобы узнать разрешённые величины и их значение в качестве символьных атрибутов. Эти значения подстрок являются целыми числами в десятеричном представлении и могут быть объединены точкой с запятой. grep отвечает за сборку результата в полную SGR последовательность («\33[»…«m»). Популярные значения для объединения включают «1» для полужирного, «4» для подчёркивания, «5» для мерцания, «7» для инверсии, «39» для цвета переднего плана по умолчанию, с «30» по «37» для цветов переднего плана, с «90» по «97» для цветов переднего плана 16-цветного режима, с «38;5;0» по «38;5;255» для цветов переднего плана 88-цветного и 256-цветного режимов, «49» для стандартного фонового цвета, с «40» по «47» для фоновых цветов, с «100» по «107» для фоновых цветов 16-цветного режима и с «48;5;0» по «48;5;255» для фоновых цветов 88-цветного и 256-цветного режимов.

Двухбуквенные имена, используемые в переменной окружения GREP_COLORS (и некоторых других), относятся к терминальным «возможностям», способности терминала выделять текст или изменять его цвет и т. д. Эти возможности хранятся в онлайн-базе данных и доступны через библиотеку terminfo.

GREP_OPTIONS

Эта переменная указывает опции по умолчанию, которые будут помещены перед остальными явно указанными опциями. Поскольку это приводит к проблемам при написании портативных скриптов, эта возможность должна быть удалена в будущих выпусках grep и grep выводит предупреждения, если она используется. Пожалуйста, используйте псевдоним или скрипт вместо неё. Например, если grep в директории «/usr/bin», вы можете добавить $HOME/bin в ваш PATH и создать выполнимый скрипт $HOME/bin/grep, содержащий следующее:

GREP_COLOR

Эта переменная определяет цвет, используемый для подсветки (не пустого) совпадающего текста. Она является устаревшей, на её смену пришла GREP_COLORS, но всё ещё поддерживается. mt, ms, и mc возможности GREP_COLORS имеют над ней приоритет. Она может определять только цвет, используемый для подсветки не пустого текста в любой подошедшей строке (выбранной строки когда пропущена опция командной строки -v, или контекстной строки, когда указана -v). Значением по умолчанию является 01;31, что означает полужирный красный текст переднего плана на стандартном фоне терминала.

GREP_COLORS

Определяет цвета и другие атрибуты, используемые в подсветке различных частей вывода. Её значение является разделённый двоеточием список возможностей, который по умолчанию установлен в ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36 с пропущенными булевыми возможностями rv и ne (т.е. установленными на false). Поддерживаются следующие возможности.

sl=

Подстрока SGR для полных выбранных строчек (т.е. совпавших строк, когда пропущена опция командной строки -v или не-совпавшие строчки, когда указана -v). Тем не менее, если булева возможность «rv» и опция командной строки -v обе установлены, вместо этого она применяется к контексту совпавших строк. По умолчанию является пустой (т.е. стандартная цветовая пара терминала).

cx=

Подстрока SGR для полных контекстных строк (т.е. не-совпавших строчек, когда пропущена опция командной строки -v или совпавших строк, когда указана -v). Тем не менее, если булева возможность «rv» и опция командной строки -v обе установлены, то вместо этого она применяется к выбранным не-совпадающим строкам. По умолчанию является пустой (т.е. стандартная цветовая пара терминала).

rv

Булево значение, которое меняет местами значения возможностей sl= и cx= когда указана опция командной строки -v. Значение по умолчанию false (т.е. возможность пропущена).

mt=01;31

Подстрока SGR для совпавшего не пустого текста в любой совпавшей строчке (т.е. выбранной строчке, когда пропущена опция командной строки -v или строчка контекста, когда указана -v). Её настройка эквивалентная одновременной настройке двух ms= и mc= на одну величину. Значением по умолчанию является полужирный красный текст переднего плана поверх текущего фона строчки.

ms=01;31

Подстрока SGR для совпавшего не пустого текста в совпавшей строчке. (Используется только если пропущена опция командной строки -v). Эффект возможности sl= (или cx= если rv) остаётся активным, когда это имеет эффект. По умолчанию полужирный красный текст переднего плана поверх текущего фона строки.

mc=01;31

Подстрока SGR для совпавшего не пустого текста в контекстной строчке. (Используется только если указана опция командной строки -v). Эффект возможности cx= (или sl= если rv) остаётся активным, когда это имеет эффект. По умолчанию полужирный красный текст переднего плана поверх текущего фона строки.

fn=35

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

ln=32

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

bn=32

Подстрока SGR для добавляемого байтового сдвига перед строкой контента. По умолчанию это зелёный текст поверх стандартного фона терминала.

se=36

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

ne

Булево значение, которое предотвращает очистку цвета до конца строки используя Erase in Line (EL) to Right (\33[K) каждый раз, когда заканчивается окрашенный элемент. Это нужно на терминалах без поддержки EL. В других случаях полезно на терминалах, для которых возможность back_color_erase (bce) boolean terminfo неприменима, когда выбранные цвета подсветки не имеют эффекта на фон, или когда EL слишком медленная или вызывает слишком много мерцаний. По умолчанию установлена на false (т.е. возможность пропущена).

Помните, что булевы возможности не имеют часть no =… По умолчанию они пропускаются (т.е. их значение false) и становится включаются (становятся true) когда указывается их имя.

LC_ALL, LC_COLLATE, LANG

Эти переменные определяют локаль для категории LC_COLLATE, которая определяет последовательность сортировки, используемой при интерпретации диапазона выражений вроде [a-z].

LC_ALL, LC_CTYPE, LANG

Эти переменные определяет локаль для категории LC_CTYPE, которая определяет тип символов, например, какие символы являются белыми пробелами. Эта категория также определяет кодировку символов, т.е. кодировка текста UTF-8, ASCII или какая-то другая кодировка. В локали C или POSIX все символы кодируются одним байтом и каждый байт является валидным символом.

LC_ALL, LC_MESSAGES, LANG

Эти переменные определяют локаль для категории LC_MESSAGES, которая определяет язык, который grep использует для сообщений. По умолчанию локаль C использует сообщения на американском английском.

POSIXLY_CORRECT

Если установлена, grep ведёт себя как требует POSIX; в противном случае grep ведёт себя больше как другие GNU программы. POSIX требует, чтобы опции, которые следуют за именами файлов, должны трактоваться как имена файлов; по умолчанию, такие опции переставляются вперёд списка операндов и трактуются как опции. Также POSIX требует, чтобы опции без категорий, которые диагностировались как «нелегальные», по умолчанию диагностировались бы как «невалидные», поскольку они не против закона. POSIXLY_CORRECT также отключает описанный ниже _N_GNU_nonoption_argv_flags.

_N_GNU_nonoption_argv_flags_

(Здесь N – это цифровой ID процесса программы grep.) Если i-ный символ значения этой переменной окружения равен 1, не считать i-ный операнд grep опцией, даже если он является единственным. Шелл может размещать эту переменную в окружение для каждой команды, которую он запускает, определяя, какие операнды являются результатом расширением подстановочных символов имени файла и поэтому не должны трактоваться как опции. Это поведение доступно только с библиотекой GNU C и только когда не установлена POSIXLY_CORRECT.

Статус выхода

Обычно статус выхода равняется 0 если выбрана строчка, 1 если строчка не выбрана и 2 если случилась ошибка. Тем не менее, если используется -q или —quiet или —silent и выбрана строка, то статусом выхода будет 0 даже если произошла ошибка.

Примеры использования grep

Примеры команды запуска grep:

Это выводит список всех строк в файлах menu.h и main.c, которые содержат строку «hello», за которой следует строка «world»; .* означает ноль или более любых символов, т.е. между «hello» и «world» могут содержаться любые символы и эта строка будет считаться соответствующей шаблону. Опция -i говорит grep игнорировать регистр букв, что приводит к тому, что строка «Hello, world!», которая в противном случае не соответствовала, также будет считаться подходящей.

Далее несколько популярных вопросов и ответов об использовании grep с примерами вызова этой программы.

1. Как можно вывести список только имён файлов, в которых найдено совпадение?

выведет имена всех C файлов в текущей директории, чей контент упоминает «main».

2. Как рекурсивно искать по директориям?

поиск ‘hello’ во всех файлах в директории /home/gigi. Для дополнительного контроля за файлами для поиска, используйте find, grep и xargs. Например, следующая команда делает поиск только по файлам C:

Она отличается от этой команды:

которая только ищет «hello» во всех файлах в текущей директории, чьё имя заканчивается на «.c». Команда выше «find …» более похожа на команду:

3. Что если шаблон начинается с «-»?

ищет все строки, совпадающие с «—cut here—». Без -e, grep будет пытаться разобрать «—cut here—» как список опций.

4. Допустим я хочу искать по целому слову, а не по части слова?

ищет только экземпляры «hello» которые являются целым словом; она не найдёт «Othello». Для большего контроля используйте «\ » для совпадения начала и конца слов. Например:

ищет только слова, оканчивающиеся на «hello», поэтому оно будет соответствовать слову «Othello».

5. Как я могу вывести контекст вокруг совпадающих строк?

печатает две строки контекста вокруг подошедшей строки.

6. Как принудить grep печатать имя файла?

Добавьте /dev/null:

Альтернативно используйте -H, которая является расширением GNU:

7. Почему используют странное регулярное выражение для вывода ps?

Если бы шаблон был написан без квадратных кавычек, то он бы соответствовал не только ps выводу для cron, но также строке ps вывода для grep. Обратите внимание, что на некоторых платформах ps ограничивает вывод на ширину экрана; grep не имеет каких-либо лимитов на длину строки, кроме доступной памяти.

8. Почему grep пишет «Двоичный файл совпадает» («Binary file matches»)?

Если grep выводит все совпавшие «строки» из бинарного файла, она, вероятно, сгенерирует вывод, который бесполезен и даже может испортить вид. Поэтому GNU grep подавляет вывод из файлов, которые кажутся бинарными файлами. Чтобы заставить GNU grep выводить строки даже из файлов, которые похожи на бинарные, используйте опцию -a или «—binary-files=text». Для устранения сообщения «Двоичный файл совпадает», используйте опцию -I или «—binary-files=without-match».

9. Почему «grep -lv» не печатает файлы без совпадений?

«grep -lv» выводит имена всех файлов, содержащих одну или более строк, которые не совпадают. Для вывода имён всех файлов, которые не содержат совпадающие строки, используйте опцию -L или —files-without-match.

10. Я могу делать «ИЛИ» с «|», а что насчёт «И»?

найдёт все строки, которые содержат и «paul» и «franc,ois».

11. Почему пустой шаблон соответствует каждой строке ввода?

Команда grep ищет строчки, которые содержат строки, соответствующие шаблону. Каждая строчка содержит пустую строку, поэтому пустой шаблон приводит к тому, что grep находит соответствие на каждой строке. Не только пустой шаблон, также «^» (каждая строка имеет начало), «$» (каждая строка имеет окончание), «.*» (соответствует чему угодно) и многие другие шаблоны делают так, что grep находит совпадение в каждой строке.

Для совпадения с пустыми строками используйте шаблон «^$». Для совпадения с чистыми строками, используйте шаблон «^[[:blank:]]*$». Чтобы не было найдено ни одного совпадения, используйте команду «grep -f /dev/null».

12. Как я могу искать одновременно в стандартном вводе и в файлах?

Используйте специальное имя файла «»:

13. Как выразить палиндромы в регулярных выражениях?

Это можно сделать используя обратные сслыки; например, палиндром из четырёх символов:

Это будет соответствовать слову «radar» или «civic».

Поиск палиндромов из пяти букв в стандартном словаре:

Guglielmo Bondioni предложил единое регулярное выражение, которое находит все палиндромы до 19 символов длинной, используя 9 подвыражений и 9 обратных ссылок:

14. Почему эта обратная ссылка не работает?

Здесь ничего не будет выведено, поскольку первая альтернатива «(a)\1» не имеет совпадений, ведь во вводе отсутствует «aa», из-за этого «\1» во второй альтернативе не на что ссылаться, что означает, что она также не будет совпадать. В этом примере вторая альтернатива может совпасть только если совпала первая альтернатива – делая вторую излишней.

15. Как можно искать совпадения сразу по нескольким строкам?

Стандартная grep не может делать это, поскольку в своей основе её работа основана на построчной обработке. Следовательно, просто использование класса символов [:space:] не обработает новую строку (newline) тем способом, как вы могли бы ожидать.

С опцией -z (—null-data) GNU grep, каждый ввод и вывод «строчки» разделён символом null; смотрите Остальные опции. Следовательно, вы можете составлять регулярные выражения с использования символа новая строка (newline), но обычно если имеется совпадение, то будет выведен весь ввода, следовательно, это использование часто комбинируется с опциями, подавляющими вывод, такой как -q, например:

Если это недостаточно, вы можете трансформировать ввод перед передачей его в grep, или задействуйте awk, sed, perl или любые другие утилиты, которые предназначены для работы через строки.

Известные баги grep

Огромный счётчик повторений в конструкции « » может стать причиной, что grep использует много памяти. Дополнительно, определённые невразумительные регулярные выражения требуют экспоненциального времени и места и могут послужить причиной выхода grep за предел памяти.

Обратные ссылки являются очень медленными и могут потребовать экспоненциального времени.

Илон Маск рекомендует:  background в CSS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL