J'ai un bout de code HTML sous forme de chaîne de cette façon là :
$content='
<div id="bloc1">
Le contenu du bloc 1
</div>
<div id="bloc2">
Le contenu du bloc 2
</div>
<ul id="liste3">
<li>item 31</li>
<li>item 32</li>
</ul>
';
Je voudrais parser ce bout de code de façon à obtenir par exemple un tableau $mon_html de cette forme :
Code : Tout sélectionner
$mon_html['bloc1']='Le contenu du bloc 1'
$mon_html['bloc2']='Le contenu du bloc 2'
$mon_html['liste3']='<li>item 31</li><li>item 32</li>'$dom=new DomDocument();
$dom->loadHTML($content);
foreach($dom->childNodes as $node) echo '<pre>'.$node->nodeValue.'</pre>';
Je ne comprends pas pourquoi mon objet DomDocument contient deux nœuds en parcourant childNodes : un vide et le second qui contient tout le code HTML. Je m'attendais à avoir trois nœuds (2 div et 1 ul), le troisième ayant lui-même deux nœuds enfants (les deux li)...Est-ce que c'est moi qui m'y prends comme un manche ? J'ai loupé une subtilité quelque part ? Vous voyez une autre solution pour parser facilement un bout de HTML ?
EDIT : apparemment, c'est moi qui me perds dans la structure du DOM. En allant plus profondément, j'obtiens mes contenus au lieu du contenu global :
foreach($dom->documentElement->childNodes as $nodes)
foreach($nodes->childNodes as $node)
echo '<h2>'.$node->nodeName.'('.$node->getAttribute('id').')</h2><pre>'.$node->nodeValue.'</pre>';
Juste un truc qui me perturbe : entre la plupart des éléments, j'ai un nœud vide. Apparemment, ça vient des retours à la ligne dans ma chaîne (si je les supprime avec str_replace, ça marche mieux).Est-ce qu'il y a une possibilité pour afficher l'arbre du DOM une fois qu'il est construit ? Ce serait pratique si les objet DomDocument/DomElement/DomNode définissaient une méthode __tostring() mais ce n'est apparemment pas le cas.
EDIT : c'est pas idéal mais on peut convertir le DOM en XML pour l'afficher :
print_r(htmlentities($dom->saveXML()));
Ce qui me permet de comprendre pourquoi je dois passer plusieurs niveaux pour retrouver mes éléments : la construction du DOM rajoute automatiquement les balises de base HTML et BODY (ce qui est logique, en fait)...