Я использую следующий скрипт для облегченного DOM-редактора. Однако nodeValue
в цикле for
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);
Поскольку $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)); } }
Я раньше не работал с этой библиотекой на PHP, но в моем другом опыте xpath я думаю, что nodeValue на чем-либо, кроме текстового узла, блокирует теги. Если вы не уверены в том, что находится под этим узлом, я думаю, вам нужно будет рекурсивно списать $ entries-> item ($ i) -> childNodes, если вам нужно вернуть разметку.
Или … вы можете wany textContent вместо nodeValue: http://us.php.net/manual/en/class.domnode.php#domnode.props.textcontent