我的问题是:
哪些html元素可以包含具有相同标记名称的其他元素。 (就像允许的另一个<div>
内的<div>
一样。)哪些html元素(其中包含内容的人)不允许在其中包含具有相同标记名称的元素&#39 ; s后代。 (与另一个<p>
中的<p>
不同,这是不允许的。)
背景
我想编写一个html-parser(更准确的词法分析器),以便能够自动处理我的脚本从Internet读取的html文档。我知道几乎每种语言都有开箱即用的解析器(和词法分析器),但我想尝试自己编写。
执行此操作时,处理格式错误的html存在问题,其中一个问题是关闭具有有效开始标记但没有关闭标记的html元素。因此,您必须做出有根据的猜测,<div>
不匹配</div>
结束,<p>
没有匹配</p>
的情况结束。
您可以将html元素拆分为三个类:
<img>
或<br>
<div>
)<div>
可以包含文字,<p>
和许多其他元素,但<a>
中的<p>
是不允许)我对&#34; void elements&#34;不感兴趣。如1中所述,因为这些元素不能具有封闭标签(因此,它们永远不会错过结束标签)。
当创建缺少的结束标记时,必须以不同的方式处理类型2和3。
如果您收到包含此文件的文件:
<p>
大多数浏览器会在内部将其转换为以下内容:
<body> a <div> b <div> c </body>
所有div都在同一点关闭,就在第一个现有的非div-closing-tag之前,它与其匹配的开始标记一起包含缺少关闭标记的div-tag。该算法给出了嵌套元素,其中每个未闭合元素成为其先前未闭合元素的子元素。
但如果你得到这个
<body>
a
<div>
b
<div>
c
</div> <!-- inserted -->
</div> <!-- inserted -->
</body>
大多数浏览器都会将其转换为:
<body> a <p> b <p> c </body>
在这种情况下,当下一个p元素开始时,或者当检测到非p-closing-tag时,一个p元素被关闭,谁的开放伙伴在开始p-tag之前放置&# 39;关闭标签丢失了。此算法不会生成相同类型的嵌套元素,但会生成同一父节点的子节点。
为了能够决定使用哪种算法来关闭元素,我需要知道哪些元素属于哪个类。