1

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

编辑:意识到我应该说“占有”而不是“复数”:)

4

2 回答 2

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>
于 2019-08-13T17:17:44.013 回答
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 }}

演示

于 2019-08-14T06:07:29.897 回答