gpt4 book ai didi

html - 如果不使用正则表达式,HTML 解析如何工作?

转载 作者:技术小花猫 更新时间:2023-10-29 11:28:29 25 4
gpt4 key购买 nike

我每天都会看到询问如何从一些 HTML 字符串中解析或提取内容的问题,第一个回答/评论总是“不要使用 RegEx 来解析 HTML,否则你会感到愤怒!” (最后一部分有时会被省略)。

这让我很困惑,我一直认为一般来说,解析任何复杂字符串的最佳方法是使用正则表达式。那么 HTML 解析器是如何工作的呢?不是用正则表达式解析么。

使用正则表达式的一个特别论点是,并不总是有解析替代方案(例如 JavaScript,其中 DOMDocument 不是普遍可用的选项)。例如,jQuery 似乎可以很好地使用正则表达式将 HTML 字符串转换为 DOM 节点。

不确定是否要继续讨论这个问题,这是一个真正的问题,我想得到回答,而不是真正打算成为一个讨论话题。

最佳答案

So how does a HTML parser work? Doesn't it use regular expressions to parse?

嗯,不。

如果您回想起一门计算理论类(class),如果您参加过一门编译器类(class)或类似类(class),您可能会想起有不同种类的语言和计算模型。我没有资格详述所有细节,但我可以和您一起回顾几个要点。

最简单的语言和计算类型(出于这些目的)是常规语言。这些可以用正则表达式生成,并用有限自动机识别。基本上,这意味着这些语言中的“解析”字符串使用状态,而不是辅助内存。 HTML 当然不是一种常规语言。仔细想想,标签列表可以任意深度嵌套。例如,表格可以包含表格,每个表格可以包含很多嵌套标签。使用正则表达式,您也许可以挑选出一对标签,但肯定不能任意嵌套。

不正则的经典简单语言正确匹配括号。尽可能地尝试,您将永远无法构建一个永远有效的正则表达式(或有限自动机)。您需要内存来跟踪嵌套深度。

具有内存堆栈的状态机是计算模型的下一个优势。这称为下推自动机,它可以识别由上下文无关文法生成的语言。在这里,我们可以识别正确匹配的括号——事实上,堆栈是它的完美内存模型。

嗯,这对 HTML 来说足够好了吗?可悲的是没有。也许对于 super 骗子仔细验证的 XML,实际上,其中所有的标签总是完美地排列在一起。在现实世界的 HTML 中,您可以轻松找到类似 <b><i>wow!</b></i> 的片段.这显然没有嵌套,所以为了正确解析它,堆栈不够强大。

下一级别的计算是由通用语法生成并由图灵机识别的语言。这被普遍认为是有效的最强大的计算模型——一个带有辅助内存的状态机,其内存可以在任何地方修改。这就是编程语言可以做的。这就是 HTML 存在的复杂程度。

用一句话概括这里的一切:要解析一般的 HTML,您需要一种真正的编程语言,而不是正则表达式。

HTML 的解析方式与其他语言的解析方式相同:词法分析和解析。词法分析步骤将单个字符流分解为有意义的标记。解析步骤使用状态和内存将标记组装成一个逻辑连贯的文档,可以对其进行操作。

关于html - 如果不使用正则表达式,HTML 解析如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com