Я безуспешно пытался понять это. Я просмотрел много ресурсов в Интернете, и некоторые из них близки, но не совсем точны. Скажем, у меня есть следующий код:
<br>
Message 1
<br>
<br>
Here is Message 2
<br>
<br>
Here is Message 2 (again)
<br>
Я хочу вернуть все сообщения 2 и текст между ближайшими тегами разрыва. Следующее регулярное выражение близко:
<br>[\s\S]*?Message 2[\s\S]*?<br>
Однако он возвращает следующие два блока. Блок 1:
<br>
Message 1
<br>
<br>
Here is Message 2
<br>
Блок 2:
<br>
Here is Message 2 (again)
<br>
Однако мне нужно вернуть блок 1:
<br>
Here is Message 2
<br>
Сообщения, которые я получаю, всегда представлены таким образом, поэтому я не думаю, что мне нужен анализатор HTML.






Попробуйте этот шаблон регулярного выражения:
<br>((?!<br>)[\s\S])*Message 2((?!<br>)[\s\S])*<br>
Уловка, которую я здесь использую, заключается в том, чтобы смягчить .* с помощью отрицательного просмотра вперед, который утверждает, что то, что следует далее, не является маркером <br> тега. Другими словами, ((?!<br>).)* будет потреблять все, вплоть до исключения следующего тега <br>.
В качестве отказа от ответственности, как правило, мы не должны использовать регулярное выражение для анализа данных HTML. Иногда нас заставляют это делать, например если мы используем такой редактор, как Notepad ++, в котором нет анализатора HTML.
Прекрасно работает! Спасибо.