Balises échappées via "htmlentities"

Ou comment ne pas échapper une balise

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde,

Voici le contexte : Je récupère du texte via un formulaire, puis j'insère ce texte dans une page web. J'utilise la fonction htmlentities pour me protéger d'éventuelles attaques. Toutefois, je souhaite que certaines balises ne soient pas échappées, pour mettre en forme ce même texte ; par exemple, les balises strong.

Je fais donc ceci :

1
2
3
4
5
6
<?php
$pre = htmlentities ($pre, ENT_QUOTES);

$pre = str_replace('&lt;strong&gt;','<strong>', $pre);
$pre = str_replace('&lt;/strong&gt;','</strong>', $pre);
?>

Le problème est que je souhaiterais faire la même chose avec les balises de lien, mais que la balise d'ouverture n'est pas <a> mais <a href "" … >.

Auriez-vous une idée pour que cette balise ne soit pas échappée ?

Merci d'avance pour votre aide !

Hello,

Tu pourrais partir sur une expression régulière et preg_replace() :)

1
2
<?php
$pre = preg_replace("#&lt;a href=&quot;(.+)&quot;&gt;(.+)&lt;/a&gt;#", "<a href=\"$1\">$2</a>", $pre);

Mais il existe peut-être une fonction qui te permet de dire directement ce que tu veux parser malgré tout :-/

Je l'ai fait à l'arrache et sans tester, mais c'est l'idée ;)

+1 -0

Une fonction te le fait directement - sans utiliser de str_replace ni de preg_replace -, il s'agit de strip_tags, dans ton cas, elle fonctionnerais de cette manière - toutefois, je ne sais pas si elle convient précisément à ton cas puisque celle-ci retire les balises HTML et ne les remplace pas par des "&lt;" ou "&gt;" - :

1
2
// Pas de htmlentities avant
$pre = strip_tags($pre, '<strong></strong><a></a>');

J'ai essayé cette technique auparavant, qui aurait pu en effet convenir, par contre il me semble que si on met un espace dans la balise (par exemple : < strong >) strip_tags ne l'enlève pas …

J'ai aussi essayé les filtres php, qui suppriment bien toutes les balises même avec espaces, par contre on ne peut pas mettre d'exceptions …

Une fonction te le fait directement - sans utiliser de str_replace ni de preg_replace -, il s'agit de strip_tags, dans ton cas, elle fonctionnerais de cette manière - toutefois, je ne sais pas si elle convient précisément à ton cas puisque celle-ci retire les balises HTML et ne les remplace pas par des "&lt;" ou "&gt;" - :

1
2
// Pas de htmlentities avant
$pre = strip_tags($pre, '<strong></strong><a></a>');

Titi_Alone

Cette fonction peut avoir un comportement parfois mal défini en cas de balises "rompues", ce qui entraine plus de merde qu'autre chose…

J'ai essayé cette technique auparavant, qui aurait pu en effet convenir, par contre il me semble que si on met un espace dans la balise (par exemple : < strong >) strip_tags ne l'enlève pas …

Me semble pas qu'une balise puisse commencer par un espace ceci dit…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte