原始过滤器仍将&转换为&在源中

时间:2019-08-13 17:00:43

标签: twig twig-filter

我正在尝试在Twig上使用原始过滤器,但仍在源中将&转换为&

因此它输出的是’而不是’

{% if entry.title|last == "s" %}
    {% set pluralLocationName  = entry.title ~ "’"  %}
{% else %}
    {% set pluralLocationName  = entry.title ~ "’"  ~ "s" %}
{% endif %}
{% if entry.title|last == "s" %}
    {% set pluralLocationName  = entry.title ~ ("&"|raw) ~ "rsquo;" %}
{% else %}
    {% set pluralLocationName  = entry.title ~ ("&"|raw) ~ "rsquo;" ~ "s" %}
{% endif %}

编辑:意识到我应该说“拥有”而不是“多个”:)

2 个答案:

答案 0 :(得分:2)

Twig仅自动转义输出,因此您的代码可以按预期工作,并且在每次打印结果时都将其转义,因此可以

仅包装{% autoescape %}中的输出:

{% if entry.title|last == "s" %}
    {% set pluralLocationName  = entry.title ~ "’"  %}
{% else %}
    {% set pluralLocationName  = entry.title ~ "’"  ~ "s" %}
{% endif %}

{% autoescape false %}
  <div>
    {{ pluralLocationName }}
  </div>
{% endautoescape %}

输出|raw值:

{% if entry.title|last == "s" %}
    {% set pluralLocationName  = entry.title ~ "&rsquo;"  %}
{% else %}
    {% set pluralLocationName  = entry.title ~ "&rsquo;"  ~ "s" %}
{% endif %}

<div>
  {{ pluralLocationName|raw }}
</div>

答案 1 :(得分:2)

过滤器raw用于输出内容。您不能将标记为安全的内容存储在变量中。这意味着您需要在输出中添加raw,而不是输入

{% if entry.title|last == "s" %}
    {% set pluralLocationName  = entry.title ~ "&rsquo;"  %}
{% else %}
    {% set pluralLocationName  = entry.title ~ "&rsquo;"  ~ "s" %}
{% endif %}

{{ pluralLocationName | raw }}

直接打印变量而不是将其存储在变量中时,同样适用。在那里,您需要将完整的字符串用括号括起来才能完成这项工作。

原因是将首先执行过滤器,从而将&ruqou;标记为安全,但是一旦连接该字符串,它将再次被标记为不安全内容。

{% if entry.title|last == "s" %}
    {{ (entry.title ~ "&rsquo;")|raw  }}
{% else %}
    {{ (entry.title ~ "&rsquo;"  ~ "s")|raw }}
{% endif %}

边注您可能想像这样使代码段更短

{% set pluralLocationName  = entry.title ~ "&rsquo;"  ~ (entry.title|last != 's' ? 's') %}
{{ pluralLocationName | raw }}

demo