Php 我的bbcode解析器类中htmlspecialchars的奇怪行为

Php 我的bbcode解析器类中htmlspecialchars的奇怪行为,php,bbcode,htmlspecialchars,Php,Bbcode,Htmlspecialchars,我编写了一个类来解析bbcode,但在使用“escape”(函数chtml::encode是htmlspecialchars的包装器)时遇到了一个问题 MyBBcodeParser: 案例“BBcodeParser::toHtml($input,false)”: 输入:[b]你好[/b]你好 输出:你好你好(应用粗体) 案例“BBcodeParser::toHtml($input,true)”: 输入:[b]你好[/b]你好 输出:stronghello/strong&;书信电报;强积金;

我编写了一个类来解析bbcode,但在使用“escape”(函数chtml::encode是htmlspecialchars的包装器)时遇到了一个问题

MyBBcodeParser:

案例“BBcodeParser::toHtml($input,false)”:
输入:[b]你好[/b]你好
输出:你好你好
(应用粗体)

案例“BBcodeParser::toHtml($input,true)”:
输入:[b]你好[/b]你好
输出:stronghello/strong&;书信电报;强积金;燃气轮机;hello2&;lt/强积金;燃气轮机


我无法理解第二种情况的双重转义…

如果您使用输入调用
BBcodeParser::toHtml($input,true)
,则返回以下内容:

你好stronghello/strong
这是因为在preg_替换之前应用了
CHtml::encode
,从而保留了从BBcode生成的HTML代码,同时从输入中转义HTML代码(秒
,即
hello2
周围的秒)

现在,如果您再次将
CHtml::encode
应用于“转义”BBcode的结果,它将变得像您发布的一样(请注意第一个strong中的
,第二个strong中的
<;
):

stronghello/strong&;书信电报;强积金;燃气轮机;hello2&;lt/强(&);燃气轮机;

在第一种情况下,似乎根本没有编码。

在第一种情况下,它不应该提供这样的输出。你没有关闭BBCode标签。当输入为:
[b]hello[/b]
对不起,我在这里写的错误,在我的测试[b]中,被关闭时,应该用
strong
替换它。等等,等等。。。!使用
BBcodeParser::toHtml($input,true)
输出为:
stronghello/strong&;书信电报;强积金;燃气轮机;hello2&;lt/强积金;燃气轮机。当我期待你好的时候/strong@Diego:如果我查看
BBcodeParser
源代码,只有一个“转义”,因此另一个必须在代码的您部分中。你能把它也贴出来让我们看看吗?我写在这里是因为它没有在其他地方进行任何编码。事实上,如果encode设置为false,则没有其他类型的编码。如果encode为false,则在插入html时写入html<代码>$text=“[b]你好[/b]hello2
echo BBcodeParser::toHtml($text,true)输出:
stronghello/strong&;书信电报;强积金;燃气轮机;hello2&;lt/strong&a‌​议员;燃气轮机
@Diego-
echo BBcodeParser::toHtml($input,true)
将输出
hellostronghello/strong
,这仅仅是因为
encode
是在BBCode转换为HTML之前执行的,所以它不会影响
hello
,因为它包含在非HTML标记中。否则您将丢失某些内容。@cthulhu
echo BBcodeParser::toHtml($input,true)
将不会输出hello,但它会输出
strong