Aller au contenu

Remplacer correctement des balises HTML qui sont en vrac


Occi

Sujets conseillés

Bonne année le Hub ! :)

je suis en train de faire une classe pour nettoyer du HTML (virer le javascript, virer des attributs et des balises potentiellement ouverte au XSS & co).

D'ailleurs si quelqu'un connaît un script ou un début de script je suis preneur, c'est un calvaire cette classe :/

J'ai trouvé la classe Tidy (qui hélas élimine du code qui n'a pas lieu d'être éliminé), HTML purifier (usine à gaz et comportement bizarre).

Mon problème pour être plus clair est que je cherche à remettre au propre une chaîne du style :

<p> phrase 1 correctement imbriqué</p>
<p> phrase 2
<p> phrase 3 allons y gaîment sans fermer le "p" de la phrase 2</p> la j'ouvre pas mais je ferme ma phrase 4</p>

En gros du code mal imbriqué, en Regex il n'y a pas le choix je pense.

Une idée sur la façon de faire svp ?

Modifié par Occi
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Pourquoi veux-tu compliquer par une classe ?

Utilise les simples fonctions des expressions régulières (ou rationnelles) :

* doc officielle ereg_replace

* http://fr.php.net/manual/fr/book.regex.php

Par contre, comme tu le fais remarquer, ça ne va pas être évident :

- cas n°1 : ok,

- cas n°2 : rechercher ce qui commence par <p> et qui est suivi par un autre <p> (et non pas </p> puisque la syntaxe est mal écrite)

- cas n°3 : idem, sauf qu'il te faut chercher ce qui commence par </p> et suivi par un autre </p>

Début de solution :

Définis une liste de balises, et recherche celles qui sont 2 fois successives.

Modifié par lionel.a
Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton aide.

Clair ça n'est pas évident, j'ai trouvé aucun script ou début de script qui pourrait me mettre sur une bonne route à suivre.

Et en ce qui concerne l'ouverture / fermeture ça fait mal à la tête.

- Je suis en train de faire comme tu dis, je me définis une liste de balise qui ne s'imbrique pas du style : <p>, <strong>,<b>,<i>,<u>,<em>,<h*>,<a>, les balises de formulaire(<form>,<input>,<select>,<option>,<optgroup>,<textarea>), je n'en vois pas d'autre qui ne s'imbrique pas ?

Là ça reste jouable quoi qu'un peut prise de tête. Je vais faire comme tu me le conseille pour la détection. Je me base en 1er sur un tableau de balise correcte et un tableau d'ouverture pour comparer par la suite les fermetures qu'il me manque.

- Les balises qui s'imbrique... là je jette l'éponge pour l'instant je ne vois pas comment gérer ça, il faudrait que je compte les ouvertures, que je compare avec les fermetures, ensuite il m'est impossible de savoir qu'elle balise a été oublié d'être fermé par exemple : <div>plop1<div>plop2</div>plop3

Si la fermeture de plop2 est en fait la fermeture de plop1 ça plante, donc je laisse tomber cette lourde partie incertaine.

Modifié par Occi
Lien vers le commentaire
Partager sur d’autres sites

Salut,

il existe de nombreux scripts asp qui font ça très bien, un de plus plus ? Pourquoi réinventer la roue? Maintenant si tu souhaites que ce script soit sur ton site, il est toujours possible de le faire en iframe, bien qu'illégale ça fonctionne avec certains.

Maintenant si tu veux absolument le faire toi même, bravo quel courage, personnellement avant de m'intéresser aux imbrications, je commencerai par le début : est ce qu'il y a autant de balises fermées que de balises ouvertes ?

++

Patrick

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

je fais (en partie) ça durant la phase de compilation de mon moteur de template, et je n'utilise pas vraiment les expressions régulières qui (en tous cas chez moi) ne permettent pas du tout de gérer ça.

J'utilise donc un parseur de texte "classique", qui construit une pile des balises ouvertes, c'est à dire un tableau qui va contenir par exemple 'html, body, div, form, fieldset, p' ce qui permet de savoir qu'on est actuellement dans un tag "P".

En cas d'ouverture de tag, je vérifie que le nouveau tag soit autorisé à être imbriqué dans le tag courant. Et en cas de fermeture de tag, je vérifie qu'on ferme bien le dernier tag de la liste.

Et finalement en fin de traitement s'il reste des tags dans ma pile c'est qu'ils n'ont pas été fermé.

Après la contrainte est différente : je ne cherche pas à corriger le problème, mais à le détecter. Dans mon cas le but est d'éviter que les devs nous livrent un code non valide.

Maintenant s'il y a des librairies PHP facilement réutilisables, comme le dit Patrck pas la peine de réinventer la roue ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...

Bonjour et désolé pour la réponse tardive.

Merci pour vos conseils ils m'ont aidés à y voir plus clair pour la conception, j'ai donc fais la partie remise en ordre des ouvertures / fermetures d'une liste de balises qui ne s'imbriquent pas comme <p>blabla<p>blabla2</p>

Je compte utiliser ta solution kioob, de se servir d'un tableau pour détecter les balises imbriqués mal fermé. Je dis "je compte" car pour détecter c'est nikel par contre j'ai l'impression qui n'existe pas trop de solution à part l'oeil humain pour savoir qu'elle était la mise en page à la base (à la base est-ce une ouverture oubliée ou une fermeture oubliée). En attendant de trouver je fais un minimum de parsing pour remettre en ordre les balises non impraticable comme <p></p> et je vire le javascript.

Là j'en suis au parsing des attributs, puis le reste que je n'ai pas réussit à traiter je vire.

Evidemment ré-inventer la roue pour une routine ne m'emballe pas spécialement, en PHP je n'ai rien trouvé d'adapté (souvent il y a des résultats inattendu avec Tidy et HTML Purifier par exemple) et en ASP je ne connais pas, je vais éviter de mélanger les 2 langages dans ce script.

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...