尝试使用数字实体对XHTML doc的所有文本节点进行编码。使用saveXML()给我十六进制值,但我想要Ӓ
严格的数值。它也不会对破折号进行编码,并且会执行一些奇怪的操作,例如将©转换为©
(等同于©
)。我没有使用DOMDocument,所以这可能是一团糟,我猜这里有一些字符编码问题。这是我到目前为止所得到的:
$doc = new DOMDocument();
// load file
$doc->load($input);
// options
$doc->preserveWhiteSpace = true;
$doc->resolveExternals = true;
$doc->formatOutput = true;
// new xPath
$xp = new DOMXPath($doc);
// set ns for xhtml
$xp->registerNamespace("html", "http://www.w3.org/1999/xhtml");
// get all nodes
$q = "//body/*";
$nodes = $xp->query($q);
foreach ($nodes as $n) {
$children = $n->childNodes;
foreach ($children as $child) {
echo htmlentities($child->nodeValue,ENT_QUOTES|ENT_XHTML,"UTF-8",false);
}
}
此时只需回显值即可检查。像破折号这样的东西没有被编码,需要它仍然使用像½
这样的实体而不是½
。
文档可能已包含实体,因此无法对其进行双重编码,但仍需将其更改为数值。我在这里缺少什么?
答案 0 :(得分:0)
我打了一场类似的战斗,基本上放弃了并手动创建了strtr()的交换值列表;
$child->nodeValue = strtr($child->nodeValue, array('½'=>'½', '©'=>'©'));
不太理想,可能是多余的,但是当我想要它时,它给了我我想要的东西。