带有双引号表达式的js_string

时间:2018-03-18 23:22:43

标签: javascript json escaping freemarker

我们有一个有 -

的FTL

<a href='javascript:func("${event.title}");'>Link</a>

当值有撇号时,如Norman'S Birthday - 它会中断。

我们使用js_string来修复它 -

<a href="javascript:func('${event.title?js_string}');">Link</a>

但我们还必须将$expression周围的双引号更改为单引号 - 这不适用于双引号。

问题 -

有没有办法使用$expression周围的原始双引号修复此问题?

像 -

<a href='javascript:func("${event.title?js_string}");'>Link</a>

注意上面的说法不起作用。

3 个答案:

答案 0 :(得分:2)

您需要在此处应用两种转义:JavaScript字符串转义和HTML转义。您需要两者,因为这两种格式是独立的,并且JavaScript嵌入到HTML中。

如何做到这一点...原始方式是event.title?js_string?html,但很容易忘记添加?html,所以不要这样做。相反,请使用自动转义(请参阅https://freemarker.apache.org/docs/dgui_quickstart_template.html#dgui_quickstart_template_autoescaping)。如果您出于某种原因无法使用这种形式的自动转义(例如您使用的是旧的FreeMarker版本并且不允许升级),请将整个模板放入<#escape x as x?html>...</#escape>。在这两种情况下,您只需编写${event.title?js_string},它就可以正常工作。

但是,如果您使用的是#escape,请确保incompatible_improvements设置(请参阅https://freemarker.apache.org/docs/pgui_config_incompatible_improvements.html)至少为2.3.20,否则?html不会使用'。 t逃脱import pandas as pd import numpy as np import matplotlib.pyplot as plt import math data=pd.read_csv('Social_Network_Ads.csv') data_temp=data[:] x_train=data.iloc[0:300,2:4].values y_train=data.iloc[0:300,4].values x_test=data.iloc[300:,2:4].values y_test=data.iloc[300:,4].values al=0.1 t0,t1,t2=1,1,1 def grad(z0,z1,z2): i=0 s0,s1,s2=0,0,0 while i<3: z=-(z0+z1*x_train[i][0]+z2*x_train[i][1]) s0=s0+(1/(1+math.exp(z))-y_train[i]) s1=s1+((1/(1+math.exp(z))-y_train[i])*x_train[i][0]) s2=s2+((1/(1+math.exp(z))-y_train[i])*x_train[i][1]) i+i+1 z0=z0-al*s0 z1=z1-al*s1 z2=z2-al*s2 return z0,z1,z2 j=0 while j<5: a,b,c=grad(t0,t1,t2) t0,t1,t2=a,b,c print(t0,t1,t2) j=j+1

答案 1 :(得分:0)

修改event.title的值,以便单引号替换为&apos;,双引号替换为&quot;,那么您根本不必担心哪种类型的引号引用你用于其余部分。

答案 2 :(得分:0)

?js_string应该在大括号{}之外。现在,如果您想在字符串中处理单引号'',则应该在href值周围使用双引号“”,反之亦然。单引号和双引号不能在同一字符串中使用,因此它们中的任何一个都需要替换。

解决方案:
<a href="javascript:func('${event.title!?js_string}');">Link</a>

JavaScript中可以使用相同的表达式来处理特殊字符