我的 bbcode 解析器类中 htmlspecialchars 的奇怪行为
我编写了一个类来解析 bbcode,但是当我使用“escape”(函数 chtml::encode 是 htmlspecialchars 的包装器)时遇到问题。
MyBBcodeParser:http://snipt.org/srlo0
案例“BBcodeParser::toHtml($input, false )”: 输入:[b]hello[/b] hello2
输出:你好 hello2
(粗体应用)
案例“BBcodeParser::toHtml($input, true)”: 输入:[b]hello[/b] hello2
输出:<strong>hello</strong><strong>hello2</strong>
我无法理解第二种情况的双重转义...
I wrote a class to parse bbcode but I have a problem when I use the "escape" (function chtml::encode is a wrapper for htmlspecialchars).
MyBBcodeParser: http://snipt.org/srlo0
Case "BBcodeParser::toHtml($input, false)":Input: [b]hello[/b] <strong>hello2</strong>
Output: <strong>hello</strong> <strong>hello2</strong>
(bold applied)
Case "BBcodeParser::toHtml($input, true)":Input: [b]hello[/b] <strong>hello2</strong>
Output: <strong>hello</strong><strong>hello2</strong>
I can not understand the double-escape from the second case...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您使用输入调用
BBcodeParser::toHtml($input, true)
,则会返回以下内容:这是因为
CHtml::encode
在 preg_replace 之前应用,从而使 BBcode 之后生成的 HTML 代码保持不变,同时从输入中转义 HTML 代码(第二个,即 BBcode 周围的那个
)
hello2
)。现在,如果您再次将
CHtml::encode
应用于“转义”BBcode 的结果,它就会变得像您发布的那样(注意第一个强中的<
和第二种情况中的<
):在第一种情况下似乎根本没有编码。
Well if you call
BBcodeParser::toHtml($input, true)
with your input then the following is returned:This is because the
CHtml::encode
is applied before the preg_replace, thus leaving the HTML-code which was generated after the from the BBcode intact, while escaping the HTML code from the input (the seconds<strong>
, that one around thehello2
).Now if you apply
CHtml::encode
again to the result of the "escaped" BBcode it becomes like you posted (notice the<
in the first strong and the<
in the second):In the first case there seems to be no encoding at all.