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

StackOverflow https://stackoverflow.com/questions/1278491

  •  16-09-2019
  •  | 
  •  

我正在尝试为我的网站制作自己的 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>)

我真的不知道该怎么做。

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

谢谢。

有帮助吗?

解决方案

您可以在&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);

其他提示

如果是练习的话,还可以。但如果只是为了获得该功能,那么就不要重新发明轮子。解析不是一件容易的事,并且有很多成熟的解析器。当然,我会先看看 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));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top