使用PHP替换内容特定的HTML标签

时间:2018-11-19 17:56:59

标签: php html domdocument

我有HTML代码:

<div>
   <h1>Header</h1>
   <code><p>First code</p></code>
   <p>Next example</p>
   <code><b>Second example</b></code>
</div>

使用PHP,我想替换位于<元素中的所有code符号,例如上面要转换为的代码:

<div>
   <h1>Header</h1>
   <code>&lt;p>First code&lt;/p></code>
   <p>Next example</p>
   <code>&lt;b>Second example&lt;/b></code>
</div>

我尝试使用PHP DomDocument类,但是我的工作效果不佳。下面是我的代码:

$dom = new DOMDocument();
$dom->loadHTML($content);

$innerHTML= '';
$tmp = '';
if(count($dom->getElementsByTagName('*'))){
    foreach ($dom->getElementsByTagName('*') as $child) {

        if($child->tagName == 'code'){
            $tmp = $child->ownerDocument->saveXML( $child);
            $innerHTML .= htmlentities($tmp);
        }
        else{
            $innerHTML .= $child->ownerDocument->saveXML($child);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

因此,您正在正确地迭代标记,并且saveXML()的使用接近了您想要的,但是您在代码中没有尝试实际更改元素的内容。这应该起作用:

<?php
$content='<div>
   <h1>Header</h1>
   <code><p>First code</p></code>
   <p>Next example</p>
   <code><b>Second example</b></code>
</div>';
$dom = new DOMDocument();
$dom->loadHTML($content, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
foreach ($dom->getElementsByTagName('code') as $child) {
    // get the markup of the children
    $html = implode(array_map([$child->ownerDocument,"saveHTML"], iterator_to_array($child->childNodes)));
    // create a node from the string
    $text = $dom->createTextNode($html);
    // remove existing child nodes
    foreach ($child->childNodes as $node) {
        $child->removeChild($node);
    }
    // append the new text node - escaping is done automatically
    $child->appendChild($text);
}
echo $dom->saveHTML();