HTML解析器如何工作?

时间:2011-02-18 06:22:08

标签: regex html-parsing

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

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

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

// 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解析器?

1 个答案:

答案 0 :(得分:3)

我不知道那种风格是一种“正常”的做事方式。这比我见过的大多数要好,但它仍然过于接近我在this answer中所说的“天真”方法。首先,它并没有考虑到HTML评论妨碍事物的发展。还有一些法律但有些事实是它没有处理的实体。但这是大多数此类方法都落后的HTML评论。

更自然的方法是使用词法分析器剥离令牌,更像是显示in this answer’s script,然后有意义地组装。词法分析者可以很容易地了解HTML注释。

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