PHP nodeValue удаляет HTML-теги - альтернатива innerHTML? - PullRequest
4 голосов
/ 22 октября 2011

Я использую следующий скрипт для облегченного редактора DOM.Однако nodeValue в моем цикле for преобразует мои HTML-теги в обычный текст.Какая PHP-альтернатива nodeValue поддерживает мой innerHTML?

$page = $_POST['page'];
$json = $_POST['json'];

$doc = new DOMDocument();
$doc = DOMDocument::loadHTMLFile($page);

$xpath = new DOMXPath($doc);
$entries = $xpath->query('//*[@class="editable"]');
$edits = json_decode($json, true);
$num_edits = count($edits);

for($i=0; $i<$num_edits; $i++) 
{
    $entries->item($i)->nodeValue = $edits[$i]; // nodeValue strips html tags
}

$doc->saveHTMLFile($page);

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

Поскольку $edits[$i] является строкой, вам необходимо проанализировать ее в структуре DOM и заменить исходное содержимое новой структурой.

Обновление

Фрагмент кода ниже делает невероятную работу при использовании не XML-совместимого HTML. ( например, HTML 4/5)

for($i=0; $i<$num_edits; $i++)
{
    $f = new DOMDocument();
    $edit = mb_convert_encoding($edits[$i], 'HTML-ENTITIES', "UTF-8"); 
    $f->loadHTML($edit);
    $node = $f->documentElement->firstChild;
    $entries->item($i)->nodeValue = "";
    foreach($node->childNodes as $child) {
        $entries->item($i)->appendChild($doc->importNode($child, true));
    }
}
0 голосов
/ 22 октября 2011

Раньше я не работал с этой библиотекой в ​​PHP, но в моем другом опыте с xpath я думаю, что nodeValue на чем-либо, кроме текстового узла, лишает тегов. Если вы не уверены в том, что находится под этим узлом, то я думаю, что вам нужно будет рекурсивно спускать $ records-> item ($ i) -> childNodes, если вам нужно вернуть разметку обратно.

Или ... вы можете захотеть использовать textContent вместо nodeValue: http://us.php.net/manual/en/class.domnode.php#domnode.props.textcontent

...