3 votes

htmlentities avec exceptions

Je dispose d'un ensemble de balises possibles, par exemple "<main>", "<text>", "<tag>" . Le reste des caractères que je voudrais traiter avec les htmlentities (htmlspecialchars)

<main>
<text>
<tag> <>  X&Y <  <falsetag> <tag attr="123" /> </tag>
</text>
</main>

Le résultat devrait être

<main>
<text>
<tag> &lt;&gt;  X&amp;Y &lt;  &lt;falsetag&gt; <tag attr="123" /> </tag>
</text>
</main>

Quel est le meilleur moyen de le faire.

2voto

Galen Points 20535

Vous pouvez exécuter htmlentities sur le texte puis utiliser une expression régulière pour remplacer les balises autorisées. <>

Exemple...

$str = '<main>
<text>
<tag> <>  X&Y <  <falsetag> <tag attr="123" /> </tag>
</text>
</main>
';

$allowed_tags = array( 'tag', 'text', 'main' );

$escaped_str = htmlentities( $str );

$replace_what = array_map( function($v){ return "~&lt;(/?)$v(.*?)&gt;~"; }, $allowed_tags );
$replace_with = array_map( function($v){ return "<$1$v$2>"; }, $allowed_tags );

echo preg_replace( $replace_what, $replace_with, $escaped_str );

1voto

Alin Purcaru Points 21373

La seule solution que je vois est de le charger dans un analyseur XML, puis de construire récursivement la chaîne de sortie vous-même, mais cela demande un peu de travail.

Remarque : Une solution à base d'expressions régulières (comme celle proposée par Galen) ne fonctionnera pas dans tous les cas, car les valeurs d'attributs peuvent contenir des éléments suivants > .

1voto

user37337 Points 139

J'ai une solution simple qui a bien fonctionné pour moi :

$text = htmlentities($text, ENT_QUOTES, "UTF-8");
$text = htmlspecialchars_decode($text);
$text = strip_tags($text, "<p><b><h2>");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X