FTL中使用js_string时如何保留表达式外层双引号解决单引号报错
解决方案:保留HTML双引号同时修复FTL JavaScript字符串冲突
好问题!这种既要遵循HTML属性双引号规范,又要避免JavaScript字符串引号冲突的场景确实很常见。我有几个可靠的方法帮你实现需求:
方法1:结合FTL的JavaScript转义和HTML实体
这是最通用且兼容性最好的方案,核心思路是:
- 用FTL的
?escape('javascript')对标题做JavaScript字符串转义,处理掉标题中的双引号(转成\")和其他特殊字符 - 用HTML实体
"代替JavaScript里的双引号,这样就能安全地放在HTML的双引号属性中
最终代码:
<a href="javascript:func("${event.title?escape('javascript')}");">Link</a>
举个例子,如果event.title是Norman'S Birthday,FTL渲染后会得到:
<a href="javascript:func("Norman'S Birthday");">Link</a>
浏览器解析时会把"转换为双引号,最终执行的JavaScript是func("Norman'S Birthday"),完全正常工作。如果标题包含双引号(比如Norman" Party),转义后会变成Norman\" Party,最终JavaScript代码是func("Norman\" Party"),同样合法。
方法2:利用JSON字符串转义(更简洁)
FTL的?json_string会把变量转换为标准的JSON字符串(自带双引号包裹且转义所有特殊字符),我们只需要去掉前后的双引号,再用HTML实体包裹即可:
<a href="javascript:func("${event.title?json_string?replace('^"|"$', '', 'r')}");">Link</a>
这里的?replace('^"|"$', '', 'r')是用正则去掉JSON字符串首尾的双引号,剩下的内容已经是转义好的,配合"就能在HTML双引号属性中安全使用。
为什么之前的方法会受限?
你之前用?js_string后不得不换成单引号,是因为?js_string是专门为单引号包裹的JavaScript字符串设计的——它只会转义单引号为\',不会处理双引号。如果强行把它放在双引号的HTML属性里,一旦标题包含双引号,就会直接破坏HTML属性的结构。
内容的提问来源于stack exchange,提问作者jforex78
相关产品推荐
相关产品推荐

