2009-08-14 7 views
0

J'essaie de créer mon propre analyseur BBCode pour mon site Web et je cherche un moyen de "htmlentities()" sauf les codes à l'intérieur des balises PRE et la balise PRE elle-même.Comment encoder des textes en dehors de la balise <pre></pre> avec htmlentities()? (PHP)

Par exemple:

<b>Hello world</b> (outputs &lt;b&gt;Hello world&lt;&gt;) 
<pre>"This must not be converted to HTML entities"</pre> (outputs <pre>"This must not be converted to HTML entities"</pre>)

Je n'ai vraiment aucune idée de la façon de procéder.

Tout type d’aide serait apprécié :)

Merci.

+0

Utilisez un bloc de code la prochaine fois (* mis 4 places devant le code *) –

+2

Fais attention! Les balises "script" à l'intérieur des balises "pre" vont quand même faire en sorte que le navigateur lance le code javascript. – balpha

+0

Non seulement les scripts, tout élément HTML à l'intérieur d'un élément pré va être traité par le navigateur. pré n'implique pas CDATA. – Quentin

Répondre

1

Vous pouvez convertir le &lt;pre&gt; … &lt;/pre&gt; Retour à <pre> … </pre>:

// convert anything 
$str = htmlspecialchars($str); 
// convert <pre> back 
$str = preg_replace('/&lt;pre&gt;((?:[^&]+|&(?!lt;\\/pre&gt;))*)&lt;\\/pre&gt;/s', '<pre>$1</pre>', $str); 
1

Si c'est pour pratiquer, ok. Mais si c'est juste pour obtenir la fonctionnalité, ne réinventez pas la roue. L'analyse n'est pas une tâche facile, et il y a beaucoup de parseurs matures. Bien sûr, je regarderais les paquets PEAR en premier. Essayez HTML_BBCodeParser.

Si vous voulez vraiment faire vous-même, vous avez deux façons:

  • regexp
  • machines d'état

Habituellement, un mélange des deux est à portée de main. Mais comme les tags peuvent être imbriqués et mal formés, c'est vraiment difficile à coder. Au moins, utilisez un code d'analyseur générique et définissez les champs lexicaux, à partir de zéro, il faudra tout le temps que vous utilisez pour coder le site Web.

BTW: l'aide d'un BBparser ne vous dispense pas de l'entrée désinfectante utilisateur ...

EDIT: Je suis dans une bonne humeur aujourd'hui, est un extrait sur la façon d'utiliser alors voici HTML_BBCodeParser:

// if you don't know how to use pear, you'd better learn that quick 
// set the path so pear is in it 
ini_set("include_path", ini_get("include_path").":/usr/share/pear"); 
// include PEAR and the parser 
require_once("PEAR.php"); 
require_once("HTML/BBCodeParser.php"); 

// you can tweak settings from a ini fil 
$config = parse_ini_file("BBCodeParser.ini", true); 
$options = &PEAR::getStaticProperty("HTML_BBCodeParser", "_options"); 
$options = $config["HTML_BBCodeParser"]; 

// here start the parsing 
$parser = new HTML_BBCodeParser(); 
$parser->setText($the_mighty_BBCode); 
$parser->parse(); 
$parsed = $parser->getParsed(); 

// don't forget to clean that 
echo htmlspecialchars(striptags($parsed));