Регулярное выражение нескольких совпадений

#regex

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

Вопрос:

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

 (<a href="HTTP://WWW.TEST.COM/TEST/TEST.JPG">LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT.</a>) LOREM IPSUM DOLOR <a href="HTTP://WWW.TEST.COM/TEST/TEST.JPG">SIT AMET</a> CONSECTETUR ADIPISCING ELIT.
 

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

 /(<)(.*=")(.*)(">)(.*)(</.*>)/g
 

Проблема в том, что он получает только одно совпадение из-за .* before в последней группе совпадений в шаблоне регулярных выражений. Я хочу, чтобы он нашел два совпадения с этим шаблоном (который есть в этой строке). Как мне заставить его искать остановку в первом экземпляре > при поиске? Я полагаю, что это помогло бы.

Я слышал, что это называется «нежадным»? Я пробовал и ? , но, похоже, ни один из них не работает с тем, что я делаю.

Спасибо!

Комментарии:

1. @Mx каким будет ваш ожидаемый результат?

2. Привет, следите за этим. Один из ответов решил это для вас, или вопрос все еще существует? Пожалуйста, дайте нам несколько отзывов. 🙂

3. Привет @ zx81, я собираюсь взглянуть на это после работы и дам вам знать! Спасибо за продолжение.

4. Хорошо, блестяще. Дайте нам знать. 🙂

Ответ №1:

  1. К вашему сведению и FWIW, общепринятая мудрость в SO заключается в том, что регулярное выражение — не лучший способ анализа html…
  2. но если вы придерживаетесь регулярных выражений, основная проблема заключается в том, что ваши .* кванторы съедают все символы до конца строки. Это можно исправить, добавив a ? , чтобы сделать кванторы «ленивыми»: .*?

* Квантификатор означает zero or more . Это приводит . к тому, что точка соответствует каждому отдельному символу в конце строки… Затем, чтобы разрешить совпадение остальной части регулярного выражения, движок выполняет откат… Таким образом, .* в конечном итоге сопоставляется самое длинное совпадение, а не самое короткое. Напротив, это .*? поможет вам найти кратчайшее совпадение (с некоторыми оговорками, описанными в статьях ниже).

Ссылка

Комментарии:

1. Хорошо, это здорово. Мне просто нужно было добавить знак вопроса после каждого * , и это отлично сработало. Я ценю помощь. Просто любопытно, какой, по вашему мнению, лучший способ анализа HTML, если не регулярное выражение? Было бы здорово даже немного подтолкнуть в правильном направлении, я всегда стараюсь повысить эффективность своего кода.

2. Спасибо, рад, что это помогает! Для анализа html многие люди здесь рекомендуют анализатор Dom. Это действительно зависит от того, что это такое и какой язык вы используете. IMO для небольших фрагментов, которые гарантированно будут правильно сформированы (в отличие от того, что вы очистили), хорошо продуманное регулярное выражение выполнит свою работу.

3. Ах, хорошо, да, это имеет смысл. Я использую анализатор DOM для выполнения некоторой очистки экрана, но это выходит далеко за рамки того, где мне нужно находить конкретные ссылки в контенте после того, как я уже извлек данные. Некоторые строки имеют одно совпадение, некоторые — несколько и т.д. итак, я использую preg_match_all в PHP для выполнения этой работы…

4. Вы можете пройти долгий путь с preg_match, и это весело. И похоже, что вы уже знаете о анализаторах DOM. 🙂

Ответ №2:

Приведенное ниже сопоставление начинается с самого начала и останавливается при первом появлении > , а > в регулярном выражении также соответствует следующему > символу.

 (<[^>]*>
 

ДЕМОНСТРАЦИЯ

Если вы хотите сопоставить <a href только ссылку, попробуйте это регулярное выражение,

 (?(<a[^>]*>)
 

ДЕМОНСТРАЦИЯ