Как сопоставить целые элементы HTML независимо от того, что внутри, так же, как это делают браузеры? - PullRequest
2 голосов
/ 11 августа 2010

на данной странице есть куча элементов:

<div class="some class"> <-- here is anything, other divs, even other divs with
the same class, but I need to match right on closing tag for this particular
opening tag --></div>

Ответы [ 4 ]

6 голосов
3 голосов
/ 11 августа 2010
1 голос
/ 11 августа 2010

Регулярные выражения описывают операции на обычных языках.HTML не является обычным языком.Я был бы готов поспорить, что вы могли бы сделать это с помощью так называемого «рекурсивного регулярного выражения», так как они на самом деле не являются регулярными выражениями и не ограничены регулярными языками.Я был бы готов поспорить, что вы все равно лучше разберете его.

Проще всего (не самый лучший, но самый простой код в несколько строк), это вести счетвнутренние деленияВсякий раз, когда вы сталкиваетесь с тегом div, увеличивайте счет.Всякий раз, когда вы сталкиваетесь с закрывающим тегом div, сбрасывайте счетчик, если он ненулевой, или вы нашли свой полный элемент.Всякий раз, когда вы сталкиваетесь с концом файла, кто-то не закрыл свои div'ы должным образом.

Использование синтаксического анализатора XML еще проще, если вы можете зависеть от правильности кода (если вы не можете,у вас есть две проблемы ...) или вы готовы просто к ошибке в случае некорректного ввода.

0 голосов
/ 11 августа 2010

Единственное надежное решение - это анализ HTML, регулярные выражения не могут решить эту проблему во всех случаях.

На самом деле браузеры часто очень терпимы, они даже справляются с ошибками, такими как отсутствие

теги. Так что работать с произвольными страницами на самом деле довольно сложно.

Если вы имеете дело со страницей, которую вы создаете сами, то, возможно, вы можете написать несколько регулярных выражений для особых случаев. В противном случае вам может понадобиться найти настоящий синтаксический анализатор, такой как this . (никогда не использовал его сам, но вполне может быть, что вам нужно.)

...