Zelena a écrit :
Pas de solution pour une mise en forme HTML.
Exact!
Dans mon programme, j'ai besoin d'avoir la structure toute nue d'un (très mauvais) HTML.
J'ai donc fait les opérations suivantes:
1) lire le texte depuis un fichier
(sous forme de chaîne de caractères)
2) y appliquer des transformations "à la hache"
3) en faire un DOM par la fonction loadHTML
Voici ce que ça donne:
$htmlText = file_get_contents(... le fichier ...);
$htmlText = arrangeHTML($htmlText);
$errorReporting = error_reporting(E_ALL & ~E_WARNING); // pour ne pas avoir des foultitudes de warnings
$doc -> loadHTML($htmlText);
error_reporting($errorReporting); //pour remettre le reporting d'erreur à sa valeur précédente
..................................
..................................
function arrangeHTML($hmlText) {
$arrText = preg_replace_callback('#(</?\w+)#',
function($matches) {return strtolower($matches[0]);}, $hmlText); //toutes les balises en minuscules
$arrText = preg_replace('#</?tbody.*?>#', '', $arrText);//pas besoin de <tbody> dans mon contexte
$arrText = preg_replace('#\s+#', ' ', $arrText); //supprimer les mises en forme HTML
$arrText = preg_replace('#<p>\s*</p>#', '<br>', $arrText);//supprimer les <p> vides
$arrText = preg_replace('#\s*<br.*?>\s*#', '<br>', $arrText);//<br/> devient <br>
$arrText = preg_replace('#(<br>)+(<t(d|h|r))#', '$2', $arrText);//supprimer les <br> en trop avant les balises <tr> <td> <th>
$arrText = preg_replace('#(<t(r|d|h).*?>)(<br>)+#', '$1', $arrText);//idem après les mêmes balises
$arrText = preg_replace('#(<br>)+(</(td|p))#', '$2', $arrText);//à la fin de certaines balises
return $arrText;
}
Je m'attends à découvrir d'autres choses en poursuivant mon travail sur les centaines de pages accumulées depuis 2001...
Modifié par PapyJP (20 Jun 2016 - 11:13)