这似乎很简单,但是我遇到了奇怪的行为。
在树枝文件中:
{% set my_html = '<a href="#">Hello world</a>' %}
{{- true is not same as(false) ? (true is same as(false) ? ('1'~my_html)|raw : ('2'~my_html)|raw) -}}
打印的部分是('2'~my_html)|raw
,它工作正常:我看到了一个真实的链接。
输出为:
现在,它只能工作,因为我将原始过滤器应用于('1'~my_html)
...试试:
{% set my_html = '<a href="#">Hello world</a>' %}
{{- true is not same as(false) ? (true is same as(false) ? ('1'~my_html) : ('2'~my_html)|raw) -}}
它将显示:2<a href="#">Hello world</a>
我不明白为什么我需要对其他内容应用过滤器才能获得预期的结果?这是一个错误吗?
答案 0 :(得分:1)
这是raw过滤器的已记录行为。我引用了该页面上的注释:
在表达式中使用原始过滤器时要小心:
{% autoescape %} {% set hello = '<strong>Hello</strong>' %} {% set hola = '<strong>Hola</strong>' %} {{ false ? '<strong>Hola</strong>' : hello|raw }} does not render the same as {{ false ? hola : hello|raw }} but renders the same as {{ (false ? hola : hello)|raw }} {% endautoescape %}
第一个三元语句未转义:hello被标记为 安全且Twig不会转义静态值(请参见escape)。在里面 第二个三元声明,即使hello被标记为安全,hola 仍然是不安全的,整个表达也是如此。第三三元 语句被标记为安全且结果无法转义。
在github问题上的comment澄清了串联运算符将您的字符串标记为不安全。所以就你而言
{% set my_html = '<' %}
{# ('1'~my_html) is not safe, so the whole expression is not #}
{{ false
? ('1'~my_html)
: ('2'~my_html)|raw
}}
包括两个字符串:一个安全的字符串('2'~my_html)|raw
和一个不安全的字符串('1'~my_html)
(因为它不应用raw
过滤器),例如{{1 }}文档说,整个表达式保持不安全,并应用了自动转义。但是在另一种情况下,当两个字符串都标记为安全时,整个表达式将变得安全并且不应用自动转义:
raw
答案 1 :(得分:0)
这不是错误,但是由于twig
的默认设置会自动转义变量。
您可以在documentation中阅读有关它的更多信息。