解析html时,是否需要当心不需要结束标记的自闭标签,并带有结束标签?

时间:2019-07-07 14:05:45

标签: html parsing xml-parsing html-parsing solidus

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>,还是我需要解析文档的其余部分并自己确定?

1 个答案:

答案 0 :(得分:2)

我知道HTML specification是一个非常吓人的文档。但是我认为,只要有任何相关的链接,它至少可以帮助您阅读overview about elements

特别是,您会在那里看到<link>void element,该部分对此表示:

  

无效元素只有一个开始标签;不得为void元素指定结束标签。

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

尽管void元素在HTML5中不需要自动关闭,但在XHTML中确实需要将其自动关闭,因此常见的是<…/>语法。


注意: (以下内容是在我认为需要精确的HTML解析器时写的。尽管看起来有些许,但我还是将其保留在原位。激进的,因为我认为它确实为那些(试图)编写HTML解析器的人提供了一些一般性建议。)

我知道所引用的标准是一个庞大的文档,有时会造成混淆,并且总是很复杂。这使得编写HTML解析器成为一个挑战。但是没有捷径。如果要编写兼容的解析器,则必须阅读标准。如果您不太在乎合规性,那么您就不应该问什么结构合规(但是您将无权抱怨产生不合规HTML的内容创建者)。

开源解析器也作为库存在,因此没有必要编写新的解析器。另一方面,除了编写解析器之外,没有什么比教给您更多有关该任务的知识了,我尊重任何愿意这样做的人。我不认为这是我现在要承担的项目。如果要这样做,请先阅读标准。另外,请考虑加入相关的邮件列表或至少遵循某些讨论。祝你好运!

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