如何使用htmlentities()编码<pre></pre>标记之外的文本? (PHP)

时间:2009-08-14 15:22:06

标签: php regex bbcode

我正在尝试为我的网站制作自己的BBCode解析器,我正在寻找一种“htmlentities()”的方法,除了PRE标签内的代码和PRE标签本身。

例如:

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

我真的不知道如何做到这一点。

任何形式的帮助将不胜感激:)

感谢。

2 个答案:

答案 0 :(得分:1)

如果要练习,好的。但如果它只是为了得到这个功能,那么就不要重新发明轮子。解析并不是一件容易的事,并且有很多成熟的解析器。当然,我先看看PEAR包。试试HTML_BBCodeParser

如果你真的想自己做,你有两种方法:

  • 正则表达式
  • 状态机

通常两者兼而有之。但是因为标签可以嵌套并且形成不良,所以编码真的很难。至少,使用通用的解析器代码并定义词汇字段,从头开始,它将花费你用来编写网站的所有时间。

顺便说一下:使用BBparser并不能让你免于清理用户输入......

编辑:我今天心情很好,所以这里有一个关于如何使用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));

答案 1 :(得分:1)

您可以将&lt;pre&gt; … &lt;/pre&gt;转换回<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);