Оригинальный английский текст взят из журнала Smashing Magazine . Перевод Benhuoer . При перепечатке просьба указывать источник.
Регулярные выражения (Regular Expression, сокр. regex) являются мощными инструментами и могут использоваться для поиска необходимой информации в большой строке символов. Для работы он использует традиционные выражения структуры символов. К сожалению, простые регулярные выражения недостаточно эффективны для некоторых продвинутых приложений. Если структура фильтрации более сложная, возможно, вам придется использовать расширенные регулярные выражения.
Эта статья познакомит вас с передовыми методами работы с регулярными выражениями. Мы отобрали восемь часто используемых концепций и проанализировали их на примерах. Каждый пример представляет собой простой способ написания, отвечающий определенным сложным требованиям. Если вам все еще не хватает понимания основных концепций регуляризации, сначала прочтите эту статью, это руководство или статью в Wiki.
Обычный синтаксис здесь подходит для PHP и совместим с Perl.
1. Жадность/лень
Все обычные операторы, которые могут быть квалифицированы несколько раз, являются жадными. Они соответствуют как можно большей части целевой строки, что означает, что результат сопоставления будет максимально длинным. К сожалению, такой подход не всегда то, что нам нужно. Поэтому для решения проблемы мы добавляем квалификатор «ленивый». Добавление «?» после каждого жадного оператора приводит к тому, что выражение соответствует только минимально возможной длине. Кроме того, модификатор «U» также может ленивизировать операторы, которые можно уточнять несколько раз. Понимание разницы между жадным и ленивым является основой для использования расширенных регулярных выражений.
жадный оператор
Оператор * соответствует предыдущему выражению ноль или более раз. Это жадный оператор. Пожалуйста, посмотрите следующий пример:
preg_match( '/.*< /h1>/', '
Это заголовок.
Это еще один.
', $matches );
Точка (.) может обозначать любой символ, кроме символов новой строки. Приведенное выше регулярное выражение соответствует тегу h1 и всему, что находится внутри тега. Он использует точки (.) и звездочки (*), чтобы сопоставить все внутри тега. Результаты сопоставления следующие:
Это заголовок.
Это еще один.
Возвращается вся строка. Оператор * будет соответствовать всему подряд — даже закрывающему тегу h1 посередине. Поскольку он жадный, сопоставление всей строки соответствует его принципу максимизации интересов.
ленивый оператор
Немного измените приведенную выше формулу и добавьте вопросительный знак (?), чтобы сделать выражение ленивым:
/.*?< /h1>/
Таким образом, он будет чувствовать, что для выполнения задачи ему достаточно сопоставить только первый закрывающий тег h1.
Еще один жадный оператор с похожими свойствами — {n,}. Это означает, что предыдущий шаблон соответствия повторяется n или более раз. Если вопросительный знак не добавлен, он будет искать как можно больше повторений. Если он добавлен, он будет повторяться как можно меньше (конечно, «повторить»). n раз» — это минимум).
#Создаем строку
$str = 'хихихи, упс, привет';
# Используйте жадный оператор {n,} для сопоставления
preg_match( '/(hi){2,}/', $str, $matches ); # match[0] будет 'hihihi';
# Используйте ухудшенный оператор {n,} для сопоставления?
preg_match( '/(hi){2,}?/', $str, $matches ); # match[0] будет "привет"
Источник: дурацкая работа