简体   繁体   English

更改 php DOMElement 的 outerHTML?

[英]Change outerHTML of a php DOMElement?

How do I change the outerHtml of an element using PHP DomDocument class?如何使用 PHP DomDocument class 更改元素的outerHtml Make sure, no third party library is used such as Simple PHP Dom or else.确保没有使用第三方库,例如 Simple PHP Dom 或其他。

For example: I want to do something like this.例如:我想做这样的事情。

$dom = new DOMDocument;
$dom->loadHTML($html);  
$tag = $dom->getElementsByTagName('h3');
foreach ($tag as $e) {
 $e->outerHTML = '<h5>Hello World</h5>';
}

libxml_clear_errors();
$html = $dom->saveHTML();
echo $html;

And the output should be like this:而 output 应该是这样的:

Old Output: <h3>Hello World</h3>
But I need this new output: <p>Hello World</p>

You can create a copy of the element content and attributes in a new node (with the new name you need), and use the function replaceChild() .您可以在新节点中创建元素内容和属性的副本(使用您需要的新名称),并使用 function replaceChild()

The current code will work only with simple elements (a text inside a node), if you have nested elements, you will need to write a recursive function.当前代码仅适用于简单元素(节点内的文本),如果您有嵌套元素,则需要编写递归 function。

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

$titles = $dom->getElementsByTagName('h3');
for($i = $titles->length-1 ; $i >= 0 ; $i--)
{
    $title = $titles->item($i);
    $titleText = $title->textContent ; // get original content of the node

    $newTitle = $dom->createElement('h5'); // create a new node with the correct name
    $newTitle->textContent = $titleText ; // copy the content of the original node

    // copy the attribute (class, style, ...)
    $attributes = $title->attributes ;
    for($j = $attributes->length-1 ; $j>= 0 ; --$j)
    {
        $attributeName = $attributes->item($j)->nodeName ;
        $attributeValue = $attributes->item($j)->nodeValue ;

        $newAttribute = $dom->createAttribute($attributeName);
        $newAttribute->nodeValue = $attributeValue ;

        $newTitle->appendChild($newAttribute);
    }


    $title->parentNode->replaceChild($newTitle, $title); // replace original node per our copy
}


libxml_clear_errors();
$html = $dom->saveHTML();
echo $html;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM