我有一个模板:
<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按字面意思使用我的替换文字,但仍保留输入文本的转义?
答案 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
是如何实现的
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 }}