От автора: приветствую вас, друзья. В этой статье мы поговорим о свойствах квантификаторов в регулярных выражениях, конкретнее — о жадных и ленивых или нежадных квантификаторах. Начнем?
Итак, что же это за свойства такие — жадность и нежадность — и как они отражаются на работе квантификаторов. Как мы помним из предыдущей статьи, квантификаторы определяют количество повторений символа или группы символов. Чаще всего в работе используются квантификаторы + и *, которые определяют повторение символа от 1 до бесконечности и от 0 до бесконечности соответственно.
При этом все квантификаторы в регулярных выражениях по умолчанию являются жадными, то есть они будут стараться захватить как можно большее количество повторений символов. Яркий пример жадности квантификаторов можно наблюдать при поиске ссылок в строке:
1 |
$pattern = '# <a href="[^"]+">.+</a> #'; |
Что мы видим? Регулярное выражение вместо поиска двух ссылок нашло только одно совпадение, которое включает обе ссылки и весь текст между ними, то есть было захвачено много лишнего.
Произошло это как раз по причине жадности квантификаторов. В этой части шаблона — .+ — мы указали, что между открывающим и закрывающим тегами ссылки может находиться любой символ. В результате эта часть регулярки честно захватила все, начиная от знака больше первой ссылки и заканчивая знаком меньше второй ссылки. На скриншоте ниже эта часть выделена фиолетовым цветом:
Как же решить эту задачу? Достаточно просто. Мы должны изменить свойство жадности квантификатора, сделав его нежадным или ленивым. Делается это добавлением вопросительного знака после квантификатора. Тем самым квантификатор становится ленивым и будет стараться захватить как можно меньшее количество символов. Ну что же, попробуем сделать квантификатор нежадным:
1 |
$pattern = '# <a href="[^"]+">.+?</a> #'; |
Вот теперь регулярка сработала так, как мы и задумывали. Не забывайте об этом свойстве квантификаторов и ваши регулярные выражения будут работать корректно. Также стоит отметить, что в PHP нам доступен модификатор шаблона U, который делает квантификаторы по умолчанию нежадными.
На этом у меня сегодня все. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!