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 which 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';