解析 html 时,我是否需要注意不需要斜线、有结束标签的自闭标签?

When parsing html, do I need to watch out for self closing tags which do not need a solidus, having a closing tag?

HTML中的某些标签可以在没有斜线的情况下自动关闭。例如:

<link rel="shortcut icon" href="//www.google.com/favicon.ico">

有效。因此,这不是必需的:

<link rel="shortcut icon" href="//www.google.com/favicon.ico"/>

<link rel="shortcut icon" href="//www.google.com/favicon.ico">foo</link>

有了这些不需要斜线的指定标签,假设我遇到:

<link rel="shortcut icon" href="//www.google.com/favicon.ico">

我可以假设相应的 </link> 不存在,还是我需要解析文档的其余部分并自行确定?

我了解 HTML specification is a pretty intimidating document. But I think it would help you to at least read the overview about elements,点击任何看起来相关的链接。

特别是,您会在那里看到 <link> is a void element,该部分说:

Void elements only have a start tag; end tags must not be specified for void elements.

所以你的第二个例子,其中文本 foo 看起来是元素的内容,实际上是欺骗性的。在遇到文本之前该元素已经关闭,因此文本是父元素的内容(如果可能的话)。显式结束标记是错误的,应忽略。

虽然 void 元素在 HTML5 中不需要 self-closing,但它们在 XHTML 中确实需要 self-closed,因此通常会看到 <…/>语法。


注意: (以下是我在印象中需要一个精确的 HTML 解析器时写的。但我会离开它就位,尽管它可能看起来有点激进,因为我认为它确实为那些(试图)编写 HTML 解析器的人提供了一些一般性建议。)

我知道引用的标准是一个庞大的文档,有时令人困惑,而且总是很复杂。这使得编写 HTML 解析器成为一项挑战。但是没有捷径可走。如果你想写一个兼容的解析器,你必须阅读标准。如果你不太关心合规性,你不应该问什么构造是合规的(但这样你就失去了抱怨生产 non-compliant HTML 的内容创建者的权利)。

存在开源解析器,也作为库存在,因此显然没有必要编写新的解析器。另一方面,没有什么比编写解析器更能教给您有关该任务的知识了,我尊重任何致力于这样做的人。我不认为这是我此时会接受的项目。如果您想这样做,请先阅读标准。此外,考虑加入相关的邮件列表或至少关注一些讨论。祝你好运!

P.S.: 另一个有用的资源是 Mozilla 开发者网络 (MDN) 文档,链接自 WHATWG 文档。例如,参见其关于 <link> element 的章节,尤其是技术规范部分。