PHP nodeValue剥离html标签 - innerHTML替代?

时间:2011-10-22 05:21:56

标签: php dom domdocument

我正在使用以下脚本来生成轻量级DOM编辑器。但是,nodeValue循环中的for正在将我的html标记转换为纯文本。什么是nodeValue的PHP替代品,可以维护我的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 个答案:

答案 0 :(得分:2)

由于$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));
    }
}

答案 1 :(得分:0)

之前我还没有在PHP中使用该库,但在我的其他xpath体验中,我认为除了文本节点之外的其他任何节点上的nodeValue都会删除标签。如果您不确定该节点下面的内容,那么如果您需要获取标记,我认为您需要递归下降$ entries-&gt; item($ i) - &gt; childNodes回来。

或者......你可能会使用textContent而不是nodeValue: http://us.php.net/manual/en/class.domnode.php#domnode.props.textcontent