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

发布于 2024-12-22 20:14:34 字数 645 浏览 1 评论 0原文

我编写了一个类来解析 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>&lt;strong&gt;hello2&lt;/strong&gt;

I can not understand the double-escape from the second case...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

天邊彩虹 2024-12-29 20:14:34

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

<strong>hello</strong> <strong>hello2</strong>

这是因为 CHtml::encode 在 preg_replace 之前应用,从而使 BBcode 之后生成的 HTML 代码保持不变,同时从输入中转义 HTML 代码(第二个 ,即 BBcode 周围的那个 hello2)。

现在,如果您再次将 CHtml::encode 应用于“转义”BBcode 的结果,它就会变得像您发布的那样(注意第一个强中的 < 和第二种情况中的 <):

<strong>hello</strong>&lt;strong&gt;hello2&lt;/strong&gt;

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

Well if you call BBcodeParser::toHtml($input, true) with your input then the following is returned:

<strong>hello</strong> <strong>hello2</strong>

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 the hello2).

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 &lt; in the second):

<strong>hello</strong>&lt;strong&gt;hello2&lt;/strong&gt;

In the first case there seems to be no encoding at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文