提问人:Jeff 提问时间:4/20/2023 最后编辑:Jeff 更新时间:4/21/2023 访问量:77
为什么 DOMDocument 将 html 引号实体都转换为实际引号?
Why is DOMDocument converting both html quote-entities to actual quotes?
问:
我已经在这里呆了半天了,所以现在是时候寻求帮助了。
我想要的是让 DOMDocument 保留现有实体和 utf-8 字符。我现在认为仅使用 DOMDocument 这是不可能的。
$html =
'<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<p>' " & < © 庭</p>
</body>
</html>';
然后我运行:
$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_NOERROR);
echo $dom->saveHTML();
并获取实体输出:
input: ' " & < © 庭
output: ' " & < © 庭
为什么 DOMDocument 要转换和实际引号?它唯一没有碰到的是.'
"
<
很确定版权符号正在转换,因为 DOMDocument 不认为输入 html 是 utf-8,但我完全困惑为什么它将引号转换回非实体。
我以为这个技巧可以解决 utf-8 问题,但事实并非如此。mb_convert_encoding
两者都没有诀窍。$dom->loadHTML('<?xml encoding="utf-8" ?>'.$html);
答:
0赞
Jim
4/20/2023
#1
您需要为该方法提供特定元素。这将使它采用极简主义的方法来编码实体。它仍然会对那些必要的内容进行编码。我不认为有一种方法可以阻止所有实体编码的发生,但它不会尝试对每个实体进行编码。saveHTML()
$html = $dom->saveHTML($dom);
// ' " & < © 庭
评论
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: ' " < © 庭 &
output: ' " < © 庭 &
评论
DOMDocument
将所有内容解析为 DOM 的规范内部形式。它不记得您在输入 HTML 中使用的格式。所以没有办法让它不管事情。