PHP DOMDocument replace DOMElement contents with HTML string
This is another StackOverflow answer I’m moving over to my blog.
AWinter asked:
Using PHP I’m attempting to take an HTML string passed from a WYSIWYG editor and replace the children of an element inside of a preloaded HTML document with the new HTML.
So far I’m loading the document identifying the element I want to change by ID but the process to convert an HTML to something that can be placed inside a DOMElement is eluding me.
$doc = new DOMDocument(); $doc->loadHTML($html); $element = $doc->getElementById($item_id); if(isset($element)){ //Remove the old children from the element while($element->childNodes->length){ $element->removeChild($element->firstChild); } //Need to build the new children from $html_string and append to $element }
My answer:
If the HTML string can be parsed as XML, you can do this (after clearing the element of all child nodes):
$fragment = $doc->createDocumentFragment();
$fragment->appendXML($html_string);
$element->appendChild($fragment);
If $html_string
cannot be parsed as XML, it will fail. If it does, you’ll have to use loadHTML()
, which is less strict, but it will add elements around the fragment that you will have to strip.
Unlike PHP, Javascript has the innerHTML
property which allows you to do this very easily. I needed something like it for a project so I extended PHP’s DOMElement
to include Javascript-like innerHTML
access.
With it you can access the innerHTML
property and change it just as you would in Javascript:
echo $element->innerHTML;
$elem->innerHTML = 'example';