转义
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
:字符串字符集