php-latte v3中如何编写无需额外转义的JavaScript过滤器
自定义json_encode过滤器输出转义字符串问题
问题现象
- 编写自定义
json_encode模板过滤器,目标是直接输出原生JSON对象 - 预期输出:
{"foo":"bar"}
- 实际输出:
"{\"foo\":\"bar\"}"
- 现有可行但冗余的写法:追加
noescape过滤器可以拿到正确结果,但模板代码冗余,写法如下:
{$object|json_encode|noescape}
- 当前过滤器代码:
public static function json_encode(FilterInfo $info, mixed $value): string { $info->contentType = ContentType::JavaScript; return json_encode($value); }
解决方法
仅设置contentType不会关闭模板引擎默认的输出自动转义逻辑,需要在过滤器内直接标记当前输出跳过自动转义:
public static function json_encode(FilterInfo $info, mixed $value): string { // 关闭当前节点的自动转义 $info->autoEscape = false; $info->contentType = ContentType::JavaScript; return json_encode($value, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); }
修改后模板直接使用{$object|json_encode}即可输出未转义的原生JSON,无需额外追加noescape过滤器。
提示:
json_encode第二个参数传入的安全转义常量用于处理特殊字符,避免在HTML/JS上下文嵌入JSON时引发XSS漏洞。
内容的提问来源于stack exchange,提问作者Inc33
相关产品推荐
相关产品推荐

