【问题标题】:How do HTML parsers work?HTML 解析器是如何工作的?
【发布时间】:2011-06-29 15:00:10
【问题描述】:

我看过幽默的帖子并阅读了警告,我知道you don't parse HTML with regex。别担心... 我不打算尝试它

但是...这让我问:HTML 解析器是如何编码的(包括编程语言的内置函数,如 DOM 解析器和 PHP 的 strip_tags)?他们采用什么机制来解析(有时是格式错误的)标记?

我找到了one coded in JavaScriptsource,它实际上使用正则表达式来完成这项工作:

// Regular Expressions for parsing tags and attributes
var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
    endTag = /^<\/(\w+)[^>]*>/,
    attr = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;  

他们都这样做吗?是否有一种传统的标准方法来编写 HTML 解析器?

【问题讨论】:

  • 在我读完你的问题后,你链接的那个步骤突然出现在我的脑海里 :)
  • 您无法使用正则表达式解析非常规语言。您当然可以使用它们从已知的语言常规子集中提取信息(这就是他们正在做的事情),但仅此而已。
  • @NullUserException:别开玩笑了。我认为现在每个人都比这更清楚。
  • @tchrist:看起来不像
  • @tchrist:请实用并提供一个使用 pcre 并用 PHP 实现的解析器的示例。还是你只制造热空气?

标签: regex html-parsing


【解决方案1】:

我不知道这种风格是一种“正常”的做事方式。它比我见过的大多数都好,但它仍然太接近我在this answer 中所说的“幼稚”方法。一方面,它没有考虑到 HTML cmets 会妨碍事情。还有一些合法但在某种程度上它没有处理的实体问题。但大多数此类方法都失败的是 HTML cmets。

一种更自然的方法是使用词法分析器剥离标记,更像是in this answer’s script 所示,然后有意义地组装它们。词法分析器将能够很容易地了解 HTML cmets。

可以使用完整的语法来解决此问题,例如用于解析 RFC 5322 邮件地址的 shown here。这就是我在this answer 中的第二种“神奇”解决方案中采用的方法。但即使这样也只是格式良好的 HTML 的完整语法,我只对几种不同类型的标签感兴趣。我完全定义了那些,但我没有为我不关心的标签定义有效字段。

【讨论】:

  • 非常好的答案。但是(例如)DOM 库是如何在内部工作的?它做什么
  • @Peter:DOM 库是免费软件,如果你真的想了解,可以阅读它的源代码。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2011-08-02
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多