Twig - 早期的原始过滤器

时间:2013-07-05 08:26:07

标签: symfony filter twig

我想要这样的事情:

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

但即使在raw之后使用simple_bbcode过滤器,我的更改标签([b]到&lt; b&gt;)仍会被转义。

现在我有了这个:

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

这使得simple_bbcode运行良好,但也可以应用恶意代码。

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

//编辑

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

2 个答案:

答案 0 :(得分:1)

更新:此答案无法解决问题。看到我的其他答案。

您是否尝试使用{{ 'b<b>l</b>ah [b]blah[/b]'|simple_bbcode|striptags('<b>')|raw }}

我认为它可行。

如果您需要删除更多标记,例如<b>,请按以下方式添加:striptags('<b><p><a>')

我希望我能帮助你,交配。

答案 1 :(得分: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放在上面。那是你在找什么?