为什么 DOMDocument 将 html 引号实体都转换为实际引号?

Why is DOMDocument converting both html quote-entities to actual quotes?

提问人:Jeff 提问时间:4/20/2023 最后编辑:Jeff 更新时间:4/21/2023 访问量:77

问:

我已经在这里呆了半天了,所以现在是时候寻求帮助了。

我想要的是让 DOMDocument 保留现有实体和 utf-8 字符。我现在认为仅使用 DOMDocument 这是不可能的。

$html =
'<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>&#39; &quot; & &lt; © 庭</p>
    </body>
</html>';

然后我运行:

$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_NOERROR);

echo $dom->saveHTML();

并获取实体输出:

input: &#39; &quot; & &lt; © 庭
output: ' " &amp; &lt; &copy; &#24237;

为什么 DOMDocument 要转换和实际引号?它唯一没有碰到的是.&#39;&quot;&lt;

很确定版权符号正在转换,因为 DOMDocument 不认为输入 html 是 utf-8,但我完全困惑为什么它将引号转换回非实体。

我以为这个技巧可以解决 utf-8 问题,但事实并非如此。mb_convert_encoding

两者都没有诀窍$dom->loadHTML('<?xml encoding="utf-8" ?>'.$html);

php dom文档

评论

0赞 Barmar 4/20/2023
DOMDocument将所有内容解析为 DOM 的规范内部形式。它不记得您在输入 HTML 中使用的格式。所以没有办法让它不管事情。

答:

0赞 Jim 4/20/2023 #1

您需要为该方法提供特定元素。这将使它采用极简主义的方法来编码实体。它仍然会对那些必要的内容进行编码。我不认为有一种方法可以阻止所有实体编码的发生,但它不会尝试对每个实体进行编码。saveHTML()

$html = $dom->saveHTML($dom);
// ' " &amp; &lt; © 庭

评论

0赞 Jeff 4/20/2023
这很有帮助,谢谢。我会看看我能想出什么。这是一个不错的小循环我会修改并尝试。
1赞 Jeff 4/20/2023 #2

我测试了大约十几个用 PHP 编写的 HTML 解析器,唯一按预期工作的是这个 stackoverflow 答案中推荐的 HTML5DOMDocument

require 'vendor/autoload.php';

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML($html, LIBXML_NOERROR);

echo $dom->saveHTML();

结果:

input: &#39; &quot; &lt; © 庭 &nbsp; &
output: &#39; &quot; &lt; © 庭 &nbsp; &amp;