如何使用 htmlentities() 对 <pre></pre> 标签之外的文本进行编码?(PHP)
题
我正在尝试为我的网站制作自己的 BBCode 解析器,并且正在寻找一种“htmlentities()”的方法,除了 PRE 标签内的代码以及 PRE 标签本身。
例如:
<b>Hello world</b> (outputs <b>Hello world<>) <pre>"This must not be converted to HTML entities"</pre> (outputs <pre>"This must not be converted to HTML entities"</pre>)
我真的不知道该怎么做。
任何形式的帮助将不胜感激:)
谢谢。
解决方案
您可以在<pre> … </pre>
转换回<pre> … </pre>
:
// convert anything
$str = htmlspecialchars($str);
// convert <pre> back
$str = preg_replace('/<pre>((?:[^&]+|&(?!lt;\\/pre>))*)<\\/pre>/s', '<pre>$1</pre>', $str);
其他提示
如果是练习的话,还可以。但如果只是为了获得该功能,那么就不要重新发明轮子。解析不是一件容易的事,并且有很多成熟的解析器。当然,我会先看看 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));
不隶属于 StackOverflow