HTML解析器如何处理元素外部的文本(文本节点)

时间:2018-09-05 02:41:32

标签: html dom html-parsing

引用此问题:

Add html tag to string in PHP

提问者询问如何正确检测HTML文件中未标记的文本(他想根据需要插入标记)。他提供了以下示例:

<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>

(解决所提出的特定问题当然是一些文本查找/替换的问题-其复杂性足以满足预期的用例。问题提出者本人就是以此方式进行的。)

我的问题是这个:

  1. 最新的HTML5标准对未标记的文本有何看法?应如何处理?

  2. 当前的HTML解析器如何处理未标记的文本。

  3. 是否可以使用HTMLParser类(使用任何语言)解决SO52159323中有问题的问题。我的意思是通过使文本经过解析器并期望解析器识别未标记的文本及其位置?我尝试了这一点,但失败了!

PS我知道,支持HTML的浏览器和编辑器仅回显未标记的文本,至少在Chrome情况下,通过使用dev工具进行观察,它不会尝试创建任何类型的默认元素-未标记的文本只是位于此处像死鸭一样!

1 个答案:

答案 0 :(得分:1)

我不认为其他人会发表答复,因此在这里记录我从 sideshowbarker 的评论和声音建议中学到的东西

  

最新的HTML5标准对未标记文本有何看法,以及它如何   应该被治疗?

未标记的文本作为文本节点输入到DoM中。文本节点将作为出现它的元素的子节点插入。例如,在以下代码段中:

<body>
    <h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
</body>

...“第二个”是文本节点(nodeType = 3)的部分,该文本节点是body元素的子节点。

实际上有4个子文本节点(每个节点的nodeValues在下面的列表中显示)。

  1. "CR-LF "在打开 body 标签之后。
  2. "CR-LF "<h2><b>Hello World</b></h2>元素之后
  3. "CR-LF Second-CR-LF "<p>First</p>元素之后
  4. "CR-LF "<p>Third</p>元素之后

可能大多数“ uglifiers”将从文本节点中删除CR_LF和空格,这在大多数情况下可以将其全部删除。

  

当前的HTML解析器如何处理未标记的文本?

如上所述,但至少具有以下限定符:

    <html>标记之间但在<body>标记之外的
  1. 未标记文本(格式或字母/数字或二者兼有)将在<body>元素内移动。
  2. 如果缺少<body>标签,则解析器将插入它们。

例如,使用 PHPDocument (PHP内置Dom解析器)此输入。

<html>
    text before body
<body>
    <h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
    fourth
    <p>Third</p>
    <!-- comment -->
</body>
    text after body
</html> 

..产生了此DoM(未标记的文本移至<body>元素中。)

<html><body>
<p>
    text before body
</p>
    <h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
    fourth
    <p>Third</p>
    <!-- comment -->

    text after body
</body></html>

和此输入。

<html>
    <h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
    fourth
    <p>Third</p>
    <!-- comment -->
</html>

..产生了此DoM(解析器插入的<body>标签)

    <html>
    <body>
<h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
    fourth
    <p>Third</p>
    <!-- comment -->
</body>
</html>
  

SO52159323中有问题的问题是否可以通过使用   HTMLParser类(使用任何语言)。我的意思是通过运行文本   经过解析器并期望解析器标识未标记的文本   及其位置?

是的。请参阅我在Add html tag to string in PHP中的答案中的代码片段。当然,解析器会生成DoM,从而可以搜索候选节点并进行所需的处理。