Модификаторы регулярных выражений php
Модификаторы в регулярных выражениях
Практически всегда при написании регулярных выражений приходится задавать определённые режимы поиска соответствий. Таких режимов достаточно много, и они задаются с помощью модификаторов в регулярных выражений.
Небольшая таблица с модификаторами, которые используют при написании регулярных выражений.
Модификатор | Что делает |
i | Самый важный модификатор, указав который регистр (строчная или прописная буква) при поиске соответствий учитываться не будет. |
U | Если указать данный модификатор, то будет вестись поиск минимального по длине соответствия. По умолчанию же ищется максимальное по длине соответствие. |
m | Данный модификатор будет искать соответствие только в одной строке, а не по всему тексту. |
s | Противоположность модификатору m, то есть, указав данный модификатор, соответствие будет искаться по всему тексту. |
x | При использовании данного модификатора пробельные символы будут игнорироваться. То есть Вы можете написать хоть 100 пробелов, и они будут опущены. Если, конечно, Вы их не экранируете (с помощью «\«). |
Чтобы стало понятно, как используются модификаторы в регулярных выражениях, привожу пример:
Строка, которая «содержит последовательность, которая начинается с символа a, после которого идёт последовательность любых цифр, а далее идёт символ b, причём регистр не важен«, будет соответствовать регулярному выражению, написанному выше. Также заметьте, что так как мы использовали модификатор «x«, то все неэкранированные пробелы были опущены. Фактически, наше регулярное выражение имеет вид:
Примеры строк, которые соответствуют данным регулярным выражениям (напоминаю, что они идентичны друг другу в связи и использованием модификатора «x«): «a932b», «A392b», «a9B». А вот в такой строке соответствия найдено не будет: «a 993b».
Другими словами, модификатор «x» используется для написания более наглядных регулярных выражений.
После этой статьи Вы должны понять: что такое модификаторы, для чего они используются и как они используются. Если Вы ответили на эти вопросы, а также прочитали предыдущие статьи по регулярным выражениям, то можно считать, что Вы уже можете писать практически любые регулярные выражения.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 7 ):
Михаил, у Вас ошибка в предложении:(«Ксли Вы ответили на эти вопросы, а также прочитали предыдущие статьи. «) В Слове «Ксли» там должно быть «Если»
Действительно. Исправил, спасибо.
Михаил, хотел поблагодарить) Сейчас прохожу ваши платные курсы по js+ajax+ jquery по рекомендации знакомого, и хочу сказать, что все оооочень понятно и хорошо, Вы просто гуру от бога) Никакие эти компании типа гикбрейнс вообще рядом не стоят, только Вас приятно смотреть и все понятно)
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Регулярные выражения в PHP
Чтобы найти в строке какое-то совпадение, достаточно просто записать это совпадение внутри двух слэшей.
Её использование выглядит следующим образом:
Давайте приведём пример. Найдём, слово «век» в строке «человек».
Для того, чтобы быстрее составлять регулярки, есть онлайн-сервисы. Они позволяют не переписывать шаблон и запускать каждый раз код, а делать всё это прямо в браузере. Я неоднократно пользовался сервисом https://regex101.com/ и вам его рекомендую.
Я ввёл в шаблон «/ку/» и строку «кукушка». В результате получил 2 совпадения.
Помимо этого у сервиса есть вкладка «Code generator», на которой вы сразу сможете получить готовый код на PHP для своего примера:
Символы
Давайте теперь перейдём к более интересным примерам.
Давайте найдём такие совпадения для строки «кукушки не кушают шоколадки». Паттерн примет следующий вид: «/к./». То есть буква «к» и любой символ.
Видим, что нашлось немало совпадений. Давайте добавим теперь после точки ещё одну букву «ш».
Теперь совпадения только два.
Нужно найти несколько подряд идущих точек? Да не вопрос! Заэкранируйте их все:
Квантификаторы
Если что-то должно повториться точное число раз, например, 3, то пишется просто <3>.
Есть также квантификаторы, которые используются чаще других и для них сделаны специальные символы:
Немного примеров:
Символ точки, повторяющийся от одного и более раз
Восклицательный знак, перед которым либо есть вопросительный знак, либо нет
Модификаторы
Глобальный поиск
А не обратили ли вы внимание на букву g после закрывающего слеша в паттерне?
Видите? Теперь только одно совпадение осталось.
Жадность
Есть ещё один довольно популярный модификатор, который позволяет сделать поиск либо жадным, либо нежадным. Жадный поиск захватывает максимально возможную подстроку. Давайте рассмотрим вот такой пример:
Видите, какую строку захватило? А если бы нам хотелось остановиться на первой букве «к»? Тогда нам просто нужно было бы сделать поиск нежадным. Для этого используется модификатор «U»
В PHP он при этом указывается после закрывающего слеша паттерна:
Вообще, все остальные модификаторы как и «U» указываются после слеша, это только для модификатора g пришлось сделать две разные функции.
Итак, давайте сформулируем основные тезисы по жадности и нежадности:
Классы символов
Очень часто в регулярках возникает потребность в перечислении символов, которые подходят под условия. Например, нужно найти символ двоеточия, после которого идут три цифры. Для таких случаев используют классы символов. Это символы, помещённые в квадратные скобки. Примеры таких классов:
Когда вы используете такой класс в шаблоне, это соответствует одному из символов из этого шаблона. Не нескольким, а одному из них! Чтобы было несколько, нужно использовать квантификаторы.
Пример: двоеточие, после которого идут три цифры от 0 до 3
Если нужно сделать отрицание, то внутри таких кавычек перед остальными ставится символ «^».
Давайте теперь применим наши уже имеющиеся знания для проверки того, что нам передали корректный российский номер телефона. Пусть у нас будет следующее простое правило: номер должен начинаться с +7, а далее должны идти 10 цифр от 0 до 9.
Якоря в регулярных выражениях
Также нам часто приходится говорить о начале строки. Для этого есть якорь «^».
Несмотря на то, что в строке есть два слова «кукушки», под шаблон попало только первое, так как оно находится в начале строки.
Давайте вернёмся к примеру с телефонами. В прошлый раз мы использовали шаблон «/+75<10>/». Однако, если строка содержит больше цифр в конце, то она просто отбросит лишнее.
По сути, этот телефон некорректный. Однако, с помощью якорей мы можем сделать так, что в строке будет только телефон, без лишней лабуды. Некорректный телефон не попадает в совпадение:
А корректный попадает:
Многострочный режим
Если мы сейчас запишем несколько телефонов в разных строках, то не один не подпадёт под эту регулярку.
«ИЛИ» в регулярках
Для случаев, когда нам нужно использовать что-то на выбор, либо одно, либо другое, нужно использовать конструкцию вида:
Маски
Маски это очень крутая вещь в регулярках, которая используется повсеместно. Благодаря им можно не только проверить строку на соответствие шаблону, но и выделить из неё некоторые подстроки и использовать их отдельно!
Пример задачи: нужно из строки Меняем автора статьи 123 c «Иван» на «Пётр» извлечь идентификатор статьи и имена авторов.
Вот такие вот задачи в реальном программировании встречаются повсеместно и решаются именно регулярками с использованием масок. Для того, чтобы захватить определенную часть строки, нужно поместить эту часть шаблона в круглые скобки.
Нагляднее всего это можно увидеть на примере:
Видите, справа у нас появились дополнительные совпадения? В PHP мы можем сделать из этого отдельные переменные!
Делается это проще простого:
Соответственно, нам остаётся лишь определить переменные под всё это дело:
А ещё маске можно дать имя прямо в шаблоне, вот так:
В коде будет выглядеть вот так:
И мы можем получить id статьи вот так:
Ещё один реальный пример
Практически на любом современном сайте все адреса вида: https://php.zone/post/892
Дальше он ищет статью в базе данных с таким идентификатором и возвращает её пользователю.
Это далеко не вся инфа о регулярках, но этого достаточно для 95% решения реальных задач. Забивать голову остальным и упарываться не советую 🙂
Домашка
У вас есть переменная
С помощью регулярных выражений выдерните из этой переменной 2 значения и положите их в переменные:
Регулярные выражения
Регулярные выражения, это очень мощный, но в то же время сложный для понимания, инструмент обработки строк. Опишу основные моменты. Регулярное выражение это шаблон строки. По этому шаблону можно искать вхождения, производить замену, проверять на соответствие шаблону.
Правила составление шаблона (pattern)
Границы шаблона должны обозначаться определенными символами, часто используют «/«, но я предпочитаю использовать «#» потому, что от обилия прямых/обратных слешей может в глазах зарябить, а «решетки» обычно больше нигде не используются. Итак: «#ТутТелоРегулярногоВыражения#«
Указание количества, квантификаторы
Выше мы уже рассмотрели такие символы, указывающие количество предыдущих символов, как + и *. Приведем все возможности указания количества:
Спецсимволы
\ | экранирование спецсимвола |
\\ | обратный слеш |
| | Метасимвол выбора (или или) |
^ | Метасимвол начала строки |
$ | Метасимвол конца строки |
\n | Символ перевода строки (шестнадцатеричный код 0x0A) |
\r | Символ возврата каретки (шестнадцатеричный код 0x0D) |
\t | Символ табуляции (шестнадцатеричный код 0x09) |
. | Точка. Любой символ. |
Для некоторых групп символов есть специальные сокращения:
\d | Цифра (0-9), вместо 9 |
\D | Не цифра (любой символ кроме символов 0-9) |
\s | Пустой символ (обычно пробел и символ табуляции) |
\S | Непустой символ (все, кроме символов, определяемых метасимволом \s) |
\w | «Словарный» символ (символ, который используется в словах. Обычно все буквы, все цифры и знак подчеркивания (‘_‘)) |
\W | Все, кроме символов, определяемых метасимволом \w |
«Жадность»
Рассмотрим понятие жадности регулярного выражения. Например есть строка:
«сейчас будет ссылка ссылка1, и еще ссылка2, итого 2 ссылки.«
Нужно получить ссылки, для этого составили выражение:
Вроди все верно, подвыражение подходит под:
Но оно также подходит под:
— его то мы и получим, т.к. регулярные выражения по умолчанию «жадные». Снять жадность можно с помощью модификатора «U«, вот так:
Модификаторы
После регулярного выражения могут идти модификаторы: «#ТутТелоРегулярногоВыражения#ТутМодификаторы» Виды модификаторов:
i | Включает режим case-insensitive, т.е. большие и маленькие буквы в выражении не различаются. |
m | Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы ‘^’ и ‘$’ указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста. |
s | По умолчанию метасимвол ‘.‘ не включает в свое определение символ перевода строки. Указание этого модификатора снимает это ограничение. |
U | Снимает жадность регулярного выражения |
u | Включает работу регулярных выражений с кириллицей в UTF-8, иначе работает не корректно. |
php Функции для работы с регулярными выражениями
Ссылка на полный список функций. Тут приведу краткое описание некоторых функций. Внимание. описываемые ниже функции имеют больше возможностей, чем описываю я, все возможности можно посмотреть, перейдя по приведенной чуть выше ссылке.
preg_match
Выполняет проверку на соответствие регулярному выражению:
preg_match_all
Выполняет глобальный поиск шаблона в строке:
Возвращает количество найденных вхождений шаблона (которое может быть и нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки. В переменную $res попадет результат поиска в виде массива: [0] содержит массив полных вхождений шаблона, элемент [1] содержит массив вхождений первой подмаски, и так далее. Для удобства работы с регулярными выражениями я создал страницу, где в режиме online можно поработать с функцией preg_match_all
preg_replace
preg_split
Разбивает строку по регулярному выражению:
Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.
Шпаргалка по регулярным выражениям
Квантификаторы
Аналог | Пример | Описание | |
---|---|---|---|
? | a? | одно или ноль вхождений «а» | |
+ | a+ | одно или более вхождений «а» | |
* | a* | ноль или более вхождений «а» |
Модификаторы
Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.
Спецсимволы
Аналог | Описание | |
---|---|---|
() | подмаска, вложенное выражение | |
[] | групповой символ | |
количество вхождений от «a» до «b» | ||
| | логическое «или», в случае с односимвольными альтернативами используйте [] | |
\ | экранирование спец символа | |
. | любой сивол, кроме перевода строки | |
\d | 2 | десятичная цифра |
\D | [^\d] | любой символ, кроме десятичной цифры |
\f | конец (разрыв) страницы | |
\n | перевод строки | |
\pL | буква в кодировке UTF-8 при использовании модификатора u | |
\r | возврат каретки | |
\s | [ \t\v\r\n\f] | пробельный символ |
\S | [^\s] | любой символ, кроме промельного |
\t | табуляция | |
\w | [0-9a-z_] | любая цифра, буква или знак подчеркивания |
\W | [^\w] | любой символ, кроме цифры, буквы или знака подчеркивания |
\v | вертикальная табуляция |
Спецсимволы внутри символьного класса
Пример | Описание | |
---|---|---|
^ | [^da] | отрицание, любой символ кроме «d» или «a» |
— | [a-z] | интервал, любой симво от «a» до «z» |
Позиция внутри строки
Якоря
Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид:
Здесь символ ^ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.
Символьные классы
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:
POSIX
POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.
Утверждения
Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».
Итак, парсер проверяет несколько следующих символов по предложенному шаблону ( werty ). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ( [^\s]* ).
Кванторы
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
Экранирование в регулярных выражениях
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).
Шаблон для нахождения точки таков:
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой.
Спецсимволы экранирования в регулярных выражениях
Подстановка строк
Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.
Группы и диапазоны
Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:
Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:
Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.
Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:
Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этой конкретной функции):
Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:
Модификаторы шаблонов
Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.
Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:
Модификаторы добавляются в конец этой строки, вот так:
Мета-символы
Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.