1

我想要这样的东西:

{{ 'bl<b>a</b>h [b]blah[/b]'|raw|simple_bbcode }}

但是即使在 raw 之后使用了 simple_bbcode 过滤器,我更改的标签([b] 到 < b>)仍然被转义。

现在我有这个:

{{ 'b<b>l</b>ah [b]blah[/b]'|simple_bbcode|raw }}

这使得 simple_bbcode 运行良好,但它也让恶意标签被应用。

我知道为什么会发生这种情况,但我不知道如何让它像我想要的那样工作。有什么建议么?

// 编辑

忘了提到将过滤器更改为函数不会改变任何内容。

4

2 回答 2

1

更新:这个答案不能解决问题。请参阅我的另一个答案。

你试过{{ 'b<b>l</b>ah [b]blah[/b]'|simple_bbcode|striptags('<b>')|raw }}吗?

我认为它可以工作。

如果您需要删除更多标签,例如<b>以这种方式添加它们:striptags('<b><p><a>')

我希望我能帮助你,伙计。

于 2013-07-05T10:13:41.037 回答
1

忘记之前的答案,我找到了一个可行的解决方案:

我们有我们的文字:

{{ '<b>We</b> have a <a href="#">link</a> that [b]should[/b] not work.'|simple_bbcode|raw }}

我们假设您已经注册了您的simple_bbcode过滤器,因此我们将跳过该部分并直接进入过滤器代码:

public function simpleBbcodeFilter($string)
{
    return preg_replace(array('/\[b\]/','/\[\/b\]/'), array('<b>', '</b>'), htmlspecialchars($string));
}

这样,我们首先转义所有html 标签以禁止它们。然后,通过替换,我们只允许将[b]*[/b]代码转换为它的 html 标记。所以只会[b]*[/b]工作。如果你把,例如,[a]*[/a]将不会被转换。

在那之后,我们不能忘记放|raw,就像我上面写的那样。那是你要找的吗?

于 2013-07-08T08:36:26.613 回答