哪些html元素可以包含相同类型的元素?

时间:2015-11-15 20:51:27

标签: html dom

我的问题是:

哪些html元素可以包含具有相同标记名称的其他元素。 (就像允许的另一个<div>内的<div>一样。)哪些html元素(其中包含内容的人)不允许在其中包含具有相同标记名称的元素&#39 ; s后代。 (与另一个<p>中的<p>不同,这是不允许的。)

背景

我想编写一个html-parser(更准确的词法分析器),以便能够自动处理我的脚本从Internet读取的html文档。我知道几乎每种语言都有开箱即用的解析器(和词法分析器),但我想尝试自己编写。

执行此操作时,处理格式错误的html存在问题,其中一个问题是关闭具有有效开始标记但没有关闭标记的html元素。因此,您必须做出有根据的猜测,<div>不匹配</div>结束,<p>没有匹配</p>的情况结束。

您可以将html元素拆分为三个类:

  1. 每个定义的元素不能包含任何内容,例如<img><br>
  2. 允许包含相同类型后代的元素({1}}中允许<div>
  3. 可以包含内容但不包含相同元素类型的元素(<div>可以包含文字,<p>和许多其他元素,但<a>中的<p>是不允许)
  4. 我对&#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;关闭标签丢失了。此算法不会生成相同类型的嵌套元素,但会生成同一父节点的子节点。

    为了能够决定使用哪种算法来关闭元素,我需要知道哪些元素属于哪个类。

0 个答案:

没有答案