XHTML doc的所有文本节点上的htmlentities

时间:2012-03-21 19:23:26

标签: php encoding domdocument html-entities

尝试使用数字实体对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);
    }
}

此时只需回显值即可检查。像破折号这样的东西没有被编码,需要它仍然使用像½这样的实体而不是½

文档可能已包含实体,因此无法对其进行双重编码,但仍需将其更改为数值。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我打了一场类似的战斗,基本上放弃了并手动创建了strtr()的交换值列表;

$child->nodeValue = strtr($child->nodeValue, array('½'=>'½', '©'=>'©'));

不太理想,可能是多余的,但是当我想要它时,它给了我我想要的东西。