Как получить ближайший закрывающий тег

0

У меня есть строка вроде:

<tr><td>abc</td><td style="any" class="marked">dfg</td><td>hij</td></tr>

и я пытаюсь получить отмеченный тег td таким регулярным выражением:

/<td.*class="marked.*<\/td>/si

но получая это:

<td>abc</td><td style="any" class="marked">dfg</td><td>hij</td>

Как мне изменить регулярное выражение для получения такой строки?

<td style="any" class="marked">dfg</td>
Теги:

2 ответа

1
Лучший ответ

У вас есть два вопроса:

  1. Ваше выражение не гарантирует, что class="marked" связано с тем же тегом, что и <td в начале выражения.
  2. The .*<\/td> в конце является жадным и будет полностью соответствовать последнему закрытию </td>.

Этот шаблон будет касаться обоих этих вопросов:

/<td[^>]+class="marked">.*?<\/td>/si
  • 0
    Как упомянул @ h2ooooooo в своем ответе, синтаксический анализ HTML с помощью регулярных выражений, как правило, плохая идея. Это приемлемо только тогда, когда вы можете дать определенные гарантии о разметке. Например, этот шаблон потерпит неудачу с class="foo marked" или по ряду других причин, если HTML не очень похож на то, что было в вашем примере.
  • 0
    jmar777: да, я знаю, что регулярное выражение не очень хорошо для задач HTML. Спасибо за ответ
1

.* жадный и будет соответствовать как можно больше.

.*? ленив и будет соответствовать как можно меньше.

tl; dr: use .*? вместо.

Тем не менее, регулярное выражение не является парсером HTML, но мы прошли через это много раз, прежде чем

Ещё вопросы

Сообщество Overcoder
Наверх
Меню