Twig

灵活、快速且安全
PHP 模板引擎

a Symfony Product
您正在阅读 Twig 3.x 的文档。切换到 Twig 1.x, 2.x 的文档。

问题与反馈

许可证

Twig 文档 根据新 BSD 许可证 获得许可。

转义

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

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

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

为了方便起见,e 过滤器被定义为一个别名

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

由于可选参数定义了要使用的转义策略,escape 过滤器也可以在 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 body 上下文转义字符串,
    或用于 引号内 的 HTML 属性值。
  • js:为 JavaScript 上下文转义字符串。这适用于
    在 JavaScript 或 JSON 字符串中使用,并使用反斜杠转义对值进行编码
    序列。
  • css:为 CSS 上下文转义字符串。CSS 转义可以应用于插入到 CSS 中的任何字符串,并转义除字母数字字符以外的所有内容。
  • url:为 URI 或参数 上下文转义字符串。这不应用于转义整个 URI;仅应用于插入的子组件。
  • html_attr:为 HTML 属性 上下文转义字符串,不带引号 包裹 HTML 属性值。

请注意,在 HTML 文档中进行上下文转义很困难,选择正确的转义策略取决于许多因素。请阅读相关文档,例如 OWASP 防御备忘单,以了解有关此主题的更多信息。

注意

在内部,escape 使用 PHP 原生 htmlspecialchars 函数作为 HTML 转义策略。

注意

当使用自动转义时,如果自动转义策略与 escape 过滤器应用的策略相同时,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 %}

提示

当您需要时,html_attr 转义策略可能很有用
转义 动态 HTML 属性名称

1
<p {{ your_html_attr|e('html_attr') }}="attribute value">

它也可以用于转义 动态 HTML 属性值
如果它没有被引用,但这 性能较低
相反,建议引用 HTML 属性值并使用
html 转义策略

1
2
3
4
<p data-content="{{ content|e('html') }}">

{# is equivalent to, but is less performant #}
<p data-content={{ content|e('html_attr') }}>

自定义转义器

3.10

EscaperRuntime 类已在 3.10 中添加。在以前的版本中,您可以通过在转义器扩展实例上调用 setEscaper() 方法来定义自定义转义器。第一个参数是转义器策略(用于 escape 调用中),第二个参数必须是有效的 PHP 可调用对象

1
2
3
4
use Twig\Extension\EscaperExtension;

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

当被 Twig 调用时,可调用对象接收 Twig 环境实例、要转义的字符串和字符集。

您可以通过在转义器运行时实例上调用 setEscaper() 方法来定义自定义转义器。它接受两个参数:策略名称和一个 PHP 可调用对象,该对象接受要转义的字符串和字符集

1
2
3
4
5
6
7
8
use Twig\Runtime\EscaperRuntime;

$twig = new \Twig\Environment($loader);
$escaper = fn ($string, $charset) => $string;
$twig->getRuntime(EscaperRuntime::class)->setEscaper('identity', $escaper);

# Usage in a template:
# {{ 'Twig'|escape('identity') }}

注意

内置转义器不能被覆盖,主要是因为它们应被视为最终实现,并且为了获得更好的性能。

参数

  • strategy:转义策略
  • charset:字符串字符集