PHP – HTML Parser (text node compresi)

Ho cercato un bel po’ nella rete, ma non ho trovato soluzioni valide e complete contemporaneamente: soluzioni poco leggibili, soluzioni che non consideravano i text node
L’unica soluzione che ho trovato è stata quella di prendere dei pezzi qui e lì e creare il mio parser HTML.

Ecco il codice:

<?php
$xml="<root>aaa<a1><b1>ff</b1></a1></root>";
$dom=new DomDocument();
$dom->loadXML( $xml );
parse( $dom );

function parse( $node )
{
  foreach ($node->childNodes as $childNode)
  {
    if ($childNode->nodeType != XML_TEXT_NODE)
    {
      echo "node: " . $childNode->nodeName . "<br />";

      if ($childNode->hasAttributes())
      {
        foreach ($childNode->attributes as $attr)
        {
          echo "Attr: " . $attr->nodeName. " ". $attr->nodeValue . "<br />";
        }
      }

      if($childNode->hasChildNodes())
      {
        parse($childNode);
      }
    }
    else
    {
      echo "text node: " . $childNode->nodeValue . "<br />";
    }
  }
}
?>

Scusate la ruzzezza del codice (“ma non avuto il tempo di farlo in scala e di dipingerlo” [cit] ) :)

L’output è il seguente:

node: root
text node: aaa 
node: a1
node: b1
text node: ff
text node:

Vi conviene controllare se il text node è vuoto, così potete evitare di incappare in nodi vuoti come nell’ultima riga.

Buona navigazione nell’HTML. :)