htmlentities на всех текстовых узлах документа XHTML - PullRequest
2 голосов
/ 21 марта 2012

Попытка кодировать все текстовые узлы документа XHTML числовыми объектами. Использование 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 голосов
/ 12 апреля 2012

Я участвовал в подобной битве, в основном сдался и вручную создал список значений подкачки для strtr ();

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

Менее чем идеально, возможно, излишним, но оно дало мне именно то, что я хотел, когда я этого хотел.

...