如何替换DOM节点内的文本,将其内容保持为HTML

时间:2018-06-16 13:40:35

标签: php dom

我有一个表,用DOMDocument解析其单元格,需要替换单元格内的一些文本,将其内容保持为HTML

这是一个简单的例子:

<?php
$html = '<table><tr><td>First <a href="#!">cell</a></td><td>Second cell</td></tr></table>';
$dom = new DOMDocument;
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors(false);

foreach($dom->getElementsByTagName('td') as $td) {
    if(strpos($td->nodeValue,'First') !== false) {
        $thisTdHTML = $dom->saveXML($td);
        $td->nodeValue = '';
        $thisTdHTML = str_replace('First','First table',$thisTdHTML);
        $textNode = $dom->createTextNode($thisTdHTML);
        $td->appendChild($textNode);
    }
}

echo $dom->saveXML($dom);
?>

使用代码HTML标记包含单元格的外部标记的第一个单元格在浏览器上显示

我该如何解决问题?

1 个答案:

答案 0 :(得分:0)

好的,根据 @u_mulder 评论,我发现了这个解决方案

<?php
$html = '<table><tr><td>First <a href="#!">cell</a></td><td>Second cell</td></tr></table>';
$dom = new DOMDocument;
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors(false);
foreach($dom->getElementsByTagName('td') as $td) {
    if(strpos($td->nodeValue,'First') !== false) {
        foreach($td->childNodes as $child) {
            if(strpos($child->nodeValue,'First') !== false) {
                $child->nodeValue = str_replace('First','First table',$child->nodeValue);
            }
        }
    }
}
echo $dom->saveXML($dom);
?>

但是,孩子可能包含另一个孩子。例如,单元格内可能有一个段落,它可能包含链接等等。

是否有包含任何嵌套级别的解决方案?