escape

这个 escape 过滤器使用依赖于上下文的策略来转义字符串。

默认情况下,它使用HTML转义策略:

1
2
3
<p>
    {{ user.username|escape }}
</p>

为了方便起见, e 过滤器定义为别名:

1
2
3
<p>
    {{ user.username|e }}
</p>

这个 escape filter还可以在HTML以外的其他上下文中使用,这归功于一个可选参数,它定义了要使用的转义策略:

1
2
3
{{ user.username|e }}
{# is equivalent to #}
{{ user.username|e('html') }}

下面是如何转义JavaScript代码中包含的变量:

1
2
{{ user.username|escape('js') }}
{{ user.username|e('js') }}

这个 escape 筛选器支持以下HTML文档转义策略:

  • html :转义 HTML正文 语境。
  • js :转义 JavaScript 语境。
  • css :转义 CSS 上下文。CSS转义可以应用于插入CSS的任何字符串,并且可以转义除字母数字以外的所有内容。
  • url :转义 URI或参数 上下文。这不应用于转义整个URI;只应转义插入的子组件。
  • html_attr :转义 HTML属性 语境。

注意,在HTML文档中进行上下文转义是很困难的,选择正确的转义策略取决于很多因素。请阅读相关文档 the OWASP prevention cheat sheet 了解更多有关此主题的信息。

注解

内部, escape 使用PHP本机 htmlspecialchars 函数用于HTML转义策略。

警告

使用自动转义时,当自动转义策略与转义筛选器应用的策略相同时,Twig会尝试不对变量进行双重转义;但当使用变量作为转义策略时,这不起作用:

1
2
3
4
5
6
{% set strategy = 'html' %}

{% autoescape 'html' %}
    {{ var|escape('html') }}   {# won't be double-escaped #}
    {{ var|escape(strategy) }} {# will be double-escaped #}
{% endautoescape %}

使用变量作为转义策略时,应禁用自动转义:

1
2
3
4
5
{% set strategy = 'html' %}

{% autoescape 'html' %}
    {{ var|escape(strategy)|raw }} {# won't be double-escaped #}
{% endautoescape %}

定制逃逸者

您可以通过调用 setEscaper() 方法。第一个参数是转义器名称(将在 escape 第二个必须是一个有效的PHP可调用函数::

$twig = new \Twig\Environment($loader);
$twig->getExtension(\Twig\Extension\EscaperExtension::class)->setEscaper('csv', 'csv_escaper');

当由Twig调用时,callable接收Twig环境实例、要转义的字符串和字符集。

注解

内置转义器不能被重写,主要是因为它们应该被视为最终实现,同时也是为了获得更好的性能。

争论

  • strategy :逃跑策略
  • charset :字符串字符集