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

Raw filter still converting & to & in the source

我正在尝试在 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 %}

编辑:意识到我应该说 "possessive" 而不是 "plural" :)

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>

过滤器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