1 回答
TA贡献1856条经验 获得超11个赞
归根结底,这比上面的测试用例还要简单:
<?php
$html = '<p>ACME’s 27” Monitor is $200.</p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
echo $dom->saveHtml($dom->documentElement) . PHP_EOL;
echo $dom->saveHtml() . PHP_EOL;
那么问题来了,为什么在保存整个文档而不仅仅是一个特定的节点时,行为会有所不同?DomDocument::saveHtml
通过查看PHP源代码,我们会发现它是使用单个节点还是整个文档进行检查。对于前者,调用该函数时,编码显式设置为 null。对于后者,使用函数,编码不作为此函数的参数包含在内。htmlNodeDumpFormatOutput
htmlDocDumpMemoryFormat
这两个函数都来自 libxml2 库。查看该源,我们可以看到尝试检测文档编码,并在找不到文档编码时将其显式设置为ASCII / HTML。htmlDocDumpMemoryFormat
这两个函数最终都调用htmlNodeListDumpOutput
,并为其传递已确定的编码;null ( 不会导致编码 – 或 ASCII/HTML – 使用 HTML 实体进行编码。
我的猜测是,对于文档片段或单个节点,编码被认为不如完整文档重要。
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报