PHP DOM innerHTML method
March 20th, 2009 by Bobby WhitmanI am working this afternoon on a top secret project that involves a system to manage pages and pages of HTML content. I won’t go into anymore details, but I do need to work deeply with HTML documents. Anyway, PHPQuery is a cool idea, but after implementing it, I noticed I was getting some odd characters where they were not supposed to be. So, another solution had to be found.
I turned to the Document Object Model (DOM) class built into PHP, which I had not yet used. The documentation sucks, but it is actually a really powerful class. It is, however, lacking one vital function. The ability to get and set the HTML/XML contents of an individual node, that is, the equivalent of the innerHTML property of JavaScript DOM.
I googled for a solution but came up empty. So, I had to invent the solution myself, and after quite some time of tinkering around here’s what I’ve got:
function innerHTML(&$dom, &$node, $html = false) {
## if html parameter not specified, return the current contents of $node
if($html === false) {
$doc = new DOMDocument();
foreach ($node->childNodes as $child)
$doc->appendChild($doc->importNode($child, true));
return $doc->saveHTML();
} else {
## get rid of all current children
foreach ($node->childNodes as $child)
$node->removeChild($child);
## if html is empty, we are done.
if($html == '') return;
## load up $html as DOM fragment, append it to our now-empty $node
$f = $dom->createDocumentFragment();
$f->appendXML($html);
$node->appendChild( $f );
}
}
Not sure if this is the most efficient solution, but from what I’ve seen so far, it works.