par
abelthorne » 27 sept. 2010, 09:22
Bonjour,
Je suis de nouveau sur mon problème de "parseage" HTML (je l'avais un peu mis de côté) et j'ai un questionnement qui se rajoute.
Voici mon code actuel :
function explode_content($content){
$table=array();
$dom=new DomDocument();
$dom->loadHTML('<?xml encoding="UTF-8">'.$content);
foreach($dom->documentElement->firstChild->childNodes as $node){
if($node->nodeType===XML_ELEMENT_NODE){
if($node->hasAttribute('id')){
$tmp=new DomDocument();
foreach($node->childNodes as $subnode) $tmp->appendChild($tmp->importNode($subnode,true));
$id=$node->getAttribute('id');
$table[$id]['id']=$id;
$table[$id]['type']=$node->nodeName;
$table[$id]['content']=$tmp->saveHTML();
}
}
}
return $table;
}
Je passe un contenu HTML (récupéré depuis une BdD) à ma fonction qui me le rend "découpé" et stocké dans un tableau.
À la base, mon contenu est tout en UTF-8, stocké "en clair" (pas d'entités HTML). Dans le tableau que je récupère après la fonction, le contenu de mes balises a été converti (caractères accentués remplacés par des entités mais pas les balises elles-mêmes). Je suppose que ça vient du passage par le DomDocument temporaire, soit au moment des appendChild ou du saveHTML. De plus, si je décode le contenu avec
html_entity_decode($tmp->saveHTML()); je me retrouve avec du texte encodé en ISO.
Est-ce que c'est normal ? Le DOM travaille forcément en convertissant les caractères spéciaux en entités ? Comment modifier mon code pour que le DOM temporaire (qui sert à récupérer le contenu de mes balises avec le code, suggéré par stealth35 ci-dessus) travaille en UTF-8 ?
Au passage, j'ai dû rajouter un test sur le type des nœuds lorsque je traite le contenu : pour une raison qui m'échappe, depuis que j'ai corrigé le contenu des champs de ma BdD pour virer toutes les entités HTML (j'ai donc du texte en UTF-8), je me retrouve avec des nœuds domText qui viennent je ne sais d'où. Avant, si mon contenu était "été", le charger avec loadHTML me donnait un domElement. Maintenant que mon contenu est "été", je me retrouve avec un domElement + un domText.