更改php DOMElement的innerHTML

iav*_*ian 10 php dom

如何更改php DOMElement的innerHTML?

Key*_*van 8

我最近需要为一个项目执行此操作,最后扩展到DOMElement:http://www.keyvan.net/2010/07/javascript-like-innerhtml-access-in-php/

这是一个显示如何使用它的示例:

<?php
require_once 'JSLikeHTMLElement.php';
$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
$doc->loadHTML('<div><p>Para 1</p><p>Para 2</p></div>');
$elem = $doc->getElementsByTagName('div')->item(0);

// print innerHTML
echo $elem->innerHTML; // prints '<p>Para 1</p><p>Para 2</p>'

// set innerHTML
$elem->innerHTML = '<a href="http://fivefilters.org">FF</a>';

// print document (with our changes)
echo $doc->saveXML();
?>
Run Code Online (Sandbox Code Playgroud)


Gue*_*est 5

另一个解决方案:

1)从要插入的HTML字符串中创建新的DOMDocumentFragment;2)通过删除元素的子节点来删除元素的旧内容;3)将DOMDocumentFragment附加到我们的元素。

function setInnerHTML($element, $html)
{
    $fragment = $element->ownerDocument->createDocumentFragment();
    $fragment->appendXML($html);
    while ($element->hasChildNodes())
        $element->removeChild($element->firstChild);
    $element->appendChild($fragment);
}
Run Code Online (Sandbox Code Playgroud)

或者,我们可以将其元素替换为其干净副本,然后将DOMDocumentFragment附加到此克隆中。

function setInnerHTML($element, $html)
{
    $fragment = $element->ownerDocument->createDocumentFragment();
    $fragment->appendXML($html);
    $clone = $element->cloneNode(); // Get element copy without children
    $clone->appendChild($fragment);
    $element->parentNode->replaceChild($clone, $element);
}
Run Code Online (Sandbox Code Playgroud)

测试:

$doc = new DOMDocument();
$doc->loadXML('<div><span style="color: green">Old HTML</span></div>');
$div = $doc->getElementsByTagName('div')->item(0);
echo $doc->saveHTML();

setInnerHTML($div, '<p style="color: red">New HTML</p>');
echo $doc->saveHTML();

// Output:
// <div><span style="color: green">Old HTML</span></div>
// <div><p style="color: red">New HTML</p></div>
Run Code Online (Sandbox Code Playgroud)


Jul*_*ull 0

看看这个库 PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net/

它看起来非常简单。您可以更改innertext元素的属性。这可能有帮助。