【问题标题】:Reliably parsing HTML elements using RegEx [duplicate]使用 RegEx 可靠地解析 HTML 元素 [重复]
【发布时间】:2011-07-14 00:46:36
【问题描述】:

可能重复:
Best methods to parse HTML with PHP

我正在尝试使用 RegEx 解析网页,但在使其以可靠的方式工作时遇到了一些问题。

假设我想解析创建 div 元素的代码,并且我想提取 <div></div> 之间的所有内容。现在,这段代码可能只是<div></div>,但也很可能是这样的:

<div class="thisIsMyDivClass"><p>This text is inside the div</p></div>

如何确保无论初始 div 标签的大于/小于符号与对应的最后一个 div 标签之间有多少个字符,我将始终 获取它们之间的内容?如果我指定< 后面的字符数可以从一到一万不等,我将始终在一万个字符之后提取>,因此(很可能,除非有很多代码或文本之间)检索一堆我不需要的代码。

这是我目前的代码(由于上述原因不可靠):

/<.{1,10000}>/

【问题讨论】:

  • 最好的办法是使用适当的 HTML 解析器。您使用什么语言?
  • 我正在使用 PHP。希望有一些关于如何以最有效的方式做到这一点的好技巧。
  • 你可以使用<[^>]*>之类的东西,但就像其他人所说的那样,你需要一个合适的解析器。
  • 就上下文而言,这是 StackOverflow 上最常见的问题之一,this being the most famous version。由于您所述的原因和其他原因(包含“>”等的属性),使用正则表达式不可能 100% 可靠。在某些情况下,您可以使用类似@DevNull 的粗略方法,但请注意其局限性。

标签: php html regex parsing


【解决方案1】:

正则表达式描述所谓的正则语言 - 或 Chomsky hierarchy 中的类型 3。另一方面,HTML is a context free language 是乔姆斯基层次结构中的类型 2。所以:一般来说,没有办法用正则表达式可靠地解析 HTML。请改用 HTML 解析器。对于 PHP,您可以在这个问题中找到一些建议:How do you parse and process HTML/XML in PHP?

【讨论】:

    【解决方案2】:

    您将需要一个词法分析器和语法检查器来正确解析 html。 RegEx 的主要重点是在字符串中搜索模式。

    【讨论】:

      【解决方案3】:

      我建议使用 DOM 之类的东西。我正在做一个大型网站,并疯狂地使用 DOM。它可以工作,效果很好,只需一点点工作就可以非常强大。

      http://php.net/manual/en/book.dom.php

      【讨论】:

        猜你喜欢
        • 2017-01-07
        • 2016-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 2013-01-03
        相关资源
        最近更新 更多