如何逃避替换文字?

时间:2015-04-12 09:53:57

标签: symfony twig

我有一个模板:

<blockquote>
    <p>{{ message|replace({"\r\n\r\n":'</p><p>', "\r\r":'</p><p>', "\n\n":'</p><p>'}) }}</p>
</blockquote>

使用此输入

  

Woop-de-doo \ r \ nLa-dee-da \ r \ n \ r \ nFoo van der Bar \ r \ n \ r \ nMojo&lt; script&gt; alert(&#39; Test&#39;); &LT; /脚本&GT;

它呈现如下:

Woop-de-doo La-dee-da</p><p>Foo van der Bar</p><p>Mojo<script>alert('Test');</script>

嗯,这很遗憾,我希望我的替换HTML能够渲染。如果你在最后拍了|raw,它就可以了:

Woop-de-doo La-dee-da

Foo van der Bar

Mojo

除了它还运行输入文本中的(潜在危险的)脚本,我显然希望发生。

如何告诉Twig按字面意思使用我的替换文字,但仍保留输入文本的转义?

1 个答案:

答案 0 :(得分:2)

您是否尝试过使用php方法nl2br? http://php.net/manual/en/function.nl2br.php

您可以将它用作树枝过滤器

http://twig.sensiolabs.org/doc/filters/nl2br.html

{{ "I like Twig.\nYou will like it too."|nl2br }}

如果您想要专门进行您描述的转换,并且希望它进行预转义,然后在html中进行渲染,则必须编写自己的过滤器

为此我们看看nl2br是如何实现的

https://github.com/twigphp/Twig/blob/11f9ebe8b6fb4d18d02591c4a042d1cab94b72eb/lib/Twig/Extension/Core.php#L172

 new Twig_SimpleFilter(
   'nl2br',
   'nl2br',
   array('pre_escape' => 'html', 'is_safe' => array('html'))
 )

所以现在为了编写自己的扩展,你可以按照本教程

http://symfony.com/doc/current/cookbook/templating/twig_extension.html

class AppExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter(
                'doubleline2paragraph',
                array($this, 'doubleLine2Paragraph'),
                array('pre_escape' => 'html', 'is_safe' => array('html'))
            ),
        );
    }

    public function doubleLine2Paragraph($text)
    {
        // your transformation

        return $text;
    }

    public function getName()
    {
        return 'app_extension';
    }
}

然后注册它(如上面链接中所述),以便您可以使用它

 {{ "your text" | doubleline2paragraph }}