Aller au contenu

Parser du HTML en PHP


mathieu147

Sujets conseillés

Bonjour,

J'ai dans la base de données de mon site une table avec mes pages. Elles ont un ID et (entre autres) un contenu HTML. Lorsque je génère une page, j'inclus ce morceau de HTML en même temps que l'entête, le menu, le pied de page, etc. Tout à fait classique.

Mais, dans ce code HTML, j'ai certaines balises que je dois remplacer par d'autres. Pour l'instant, je fais ça en Javascript: j'ai un script jQuery qui récupère la balise à remplacer, et qui récupère (via xmlhttprequest) ce qu'il faut mettre à la place. Ça fonctionne très bien, mais je voudrais me passer de ce Javascript, j'aimerais faire tout ça directement en PHP.

Voici le fonctionnement un peu plus détaillé:

  • J'ai des balises IMG avec une certaine classe, je dois les récupérer toutes.
  • Pour chaque balise IMG ainsi récupérée: récupérer l'attribut alt;
  • Puis aller chercher avec une fonction ce qu'il faut mettre à la place, en fonction du alt;
  • Enlever la balise IMG et la remplacer par ce qu'il faut.

Super facile en javascript si le script replace.php me dit par quoi remplacer ma balise dont l'attribut est alt:


$(document).ready(function() {
$("img.replace").each(function() {
var alt = $(this).attr("alt");
loadReplace($(this), alt);
});
});

function loadReplace(el, alt) {
var xhr = getXhr();

xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
replace = xhr.responseText;
displayReplace(el, replace);
}
};

xhr.open("GET", replace.php + "&alt=" + alt, true);
xhr.send(null);
}

function displayReplace(el, replace) {
el.after(replace);
el.remove();
}

Existe-t-il en PHP des fonctions équivalentes qui permettent, à partir d'une chaîne de caractères représentant un fragment de HTML, de faire ce genre d'opérations?

Merci d'avance!

Lien vers le commentaire
Partager sur d’autres sites

Hello,

Si ton code est valide XML, tu peux utiliser simplexml ... par contre un véritable parseur de dom comme javascript, je n'ai pas trouvé mon bonheur en PHP, malheureusement. Si java est installé sur ton serveur, il existe un bibliothèque qui fonctionne très bien, tu pourrais donc faire des appels système en php : exec("java ...");

Par contre, j'avais des besoins très spécifiques pour faire cela (ce qui explique sans doute pourquoi je n'ai rien trouvé) qui n'étaient certes pas la réalisation d'un site internet. Je m'explique mal la raison qui motive ton besoin ?

Lien vers le commentaire
Partager sur d’autres sites

A partir du moment où l'opération ne dépend pas de la configuration du client et où elle n'est pas dépendante d'autres opérations faites en JS côté client, alors oui : non seulement, c'est possible de le faire en PHP coté serveur, mais en plus c'est là que cela doit être fait.

Tes visiteurs te diront merci (car ton site sera plus rapide)... :P

Lien vers le commentaire
Partager sur d’autres sites

Si ton code est valide XML, tu peux utiliser simplexml ...

Normalement ça doit être le cas, mais je n'en suis pas certain. C'est du code qui sort de tinyMCE. Je ne l'ai pas encore surpirs à sortir du code invalide, mais il est vrai que je n'ai pas utilisé de fonctions très avancées de l'éditeur.

Si java est installé sur ton serveur, il existe un bibliothèque qui fonctionne très bien, tu pourrais donc faire des appels système en php : exec("java ...");

C'est un mutualisé OVH, je ne sais pas si c'est installé, ça m'étonnerait...

Je m'explique mal la raison qui motive ton besoin ?

L'interface de mise à jour de mon site repose sur tinyMCE (éditeur WYSIWYG en Javascript), et je voudrais que la personne qui met à jour son site puisse inclure dans sa page des "blocs spéciaux", comme des galeries d'images, ou autre. Le problème est que faire un plugin tinyMCE qui inclut des galeries d'images peut être très compliqué, surtout si la galerie est changée par la suite. Donc j'ai fait un plugin tinyMCE qui insère des images (ça c'est facile) dont la classe est "gallery" et le alt est l'id de la galerie d'image. Ensuite à l'affichage, je voudrais remplacer la balise image par le bon contenu.

En fait en résumé c'est pour pouvoir gérer facilement (avec une seule balise) dans tinyMCE des trucs plus complexes.

A partir du moment où l'opération ne dépend pas de la configuration du client et où elle n'est pas dépendante d'autres opérations faites en JS côté client, alors oui : non seulement, c'est possible de le faire en PHP coté serveur, mais en plus c'est là que cela doit être fait.

Tes visiteurs te diront merci (car ton site sera plus rapide)... :P

Ben oui voilà... J'ai fait ça en Javascript pour pouvoir avancer un peu dans le reste de mon site qui avait besoin que ça soit fait, mais je me disais bien que c'était une solution de secours.

Lien vers le commentaire
Partager sur d’autres sites

Dans ton cas, tu dois pouvoir t'en sortir à coup de regex sans avoir besoin de parser le DOM non ? un coup de preg_replace et une expression correcte suffiront largement à ton bonheur sans plus de prise de tête :)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

il existe des parsers HTML en PHP (à tester quand même) : http://www.onderstekop.nl/articles/114/

ou alors il faut se le faire soi même à coup de preg_machin http://www.web-development-blog.com/archives/parse-html-with-preg_match_all/

ou encore il faut utiliser le DOM http://www.phpro.org/examples/Parse-HTML-With-PHP-And-DOM.html

voilà voilà

Lien vers le commentaire
Partager sur d’autres sites

Ah oui, c'est vrai que la syntaxe de ce que je dois remplacer est finalement assez simple...

Mais je me demandais quand-même s'il existait en PHP des équivalents des fonctions jQuery qui, il faut le dire, sont plutôt bien foutues.

Lien vers le commentaire
Partager sur d’autres sites

Mais je me demandais quand-même s'il existait en PHP des équivalents des fonctions jQuery qui, il faut le dire, sont plutôt bien foutues.

simplexml comme je te disais, les parser cités plus haut ne font guère mieux dans la mesure ou un code non valide va boiter

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...