0

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

例如:

<b>Hello world</b>(输出 <b>Hello world<>)
<pre>"这不能被转换成 HTML 实体"</pre> (输出 <pre>"这不能被转换成 HTML 实体"</pre>)

我真的不知道该怎么做。

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

谢谢。

4

2 回答 2

2

如果是练习的话,可以的。但如果只是为了获得功能,那就不要重新发明轮子。解析不是一件容易的事,那里有很多成熟的解析器。当然,我会先看看 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));
于 2009-08-14T15:44:59.990 回答
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);
于 2009-08-14T16:08:56.527 回答