DomDocument Au secours !!

WRInaute discret
Bonjour à tous,

Je cherche depuis plusieurs jours le moyen de modifier mes pages HTML dynamiquement en PHP avec DomDocument (que je ne maitrise pas bien du tout).

Ce que j'aimerais faire est simple :
j'aimerais lire un fichier (html) de mon serveur (avec $dom->loadHTMLFile), supprimer un nœud enfant, et le remplacer par un simple texte (sans balise).

exemple : si mon fichier contient ça :

Code:
<html>
    <body id="myBody">
        <b id="myBTag1">my old element</b>
        <b id="myBTag2">my old element</b>
        <b id="myBTag3">my old element</b>
    </body>
</html>

j'aimerais à la fin avoir ceci :

Code:
<html>
    <body id="myBody">
        bonjour
    </body>
</html>

En gros, "supprime tous les enfants de l'Id "myBody" et met le mot "bonjour". Petite précision, l'appel de l'id est très important.

Je vous remercie tous d'avance.

Orsam
 
WRInaute passionné
Tu dois pouvoir faire quelquechose comme :

Code:
   $body = $dom->getElementById("myBody");
   while ($body->childNodes->length)
    $body->removeChild($body->firstChild);
    $body->nodeValue="bonjour";
 
WRInaute discret
Bonjour MikeR,

Et merci pour ton code qui m'a beaucoup aidé. Cependant j'ai trouvé un petit "raccourci"

Code:
$toto = $dom->getElementById("myBody")->nodeValue="Boujour"

Mais, j'ai besoin encore une fois de ton aide...

Et c'est pour ça que ton code est loin d'être inintéressant... Car je pense qu'avec ton système il est possible supprimer tous les types p et span (par exemple) et de mettre à la place un texte.

J'explique : voici ce que j'ai. (Je te rassure, c'est un exemple, je ne construit pas mon HTML comme çà :lol: )
Code:
<body id="idMyBody">
	<h1>titre 1</h1>
	<p>ligne 1</p>
	<p>ligne 2</p>
	<span>ligne 3</span>
	<span>ligne 4</span>
	<h2>titre 2</h2>
</body>
Et voici ce que j'aimerais obtenir :
Code:
<body id="idMyBody">
	bonjour
	<h1>titre 1</h1>
	<h2>titre 2</h2>
</body>
Donc, toujours la sélection avec l'id (important) et suppression de toutes les balises que je ne veux pas et insertion d'un texte juste après le "idMyBody"...

Allé ! je suis sur que tu sais faire :lol: ...

Encore un grand MERCI !!!!!

Orsam
 
WRInaute passionné
Ce qui fausse un peu tout c'est que ton "bonjour" ne soit pas un node (un <p> par exemple, ça serait (beaucoup) plus simple....)

Mois, je ferais par copie selective des nodes de ta source vers un nouvel element en décidant sur le critère type contient "h" . Et juste après la création de ce nouvel élément, je mettrais nodevalue ="bonjour", avant de faire les copies.

Dis moi si tu as besoin du code...
 
WRInaute discret
Bonjour,

Oui, une petite source n'est pas de refus.

Mais il faut quand même que je t'explique ce que je souhaite faire pour que tu comprenne. Au final ce n'est pas "bonjour" qui sera ajouté, mais un include PHP. En version simple, voici ce que ça donne :

Code:
        $dom->loadHTMLFile($mon_fichier_html);
        ob_start();
        include($_SERVER['DOCUMENT_ROOT'] . JOB_DIR . '/includes/MyBody.php');
        $MyBody = ob_get_clean();
        ob_end_clean();
        $dom->getElementById('Mybody')->nodeValue = $MyBody;

Cela fonction parfaitement (avec la création d'une class extends de DomDocument). Ce qui me permet de modifier dynamiquement un HTML sans y mettre de php à la main.

Au sujet de mon dernier exemple, c'est plus compliqué, car c'est pour le head. En sachant que je veux supprimer la balise TITLE, LINK ainsi que toutes les balises META qui seront elles aussi incluses dynamiquement de la même façon que le code ci-dessus mais sans toucher au balise STYLE et aux exceptions de style tel que <!--[if lte IE 6]> ou même les @import url(css/structure_IE.css);.

Cela me permet de détacher complétement le PHP de l'HTML, ce qui m'économise quelques heures de boulot et surtout, le HTML source reste tel quel (plus simple à modifier au cas où).

Je te remercie encore pour ton aide.

Orsam
 
Discussions similaires
Haut