我正在使用Velocity(1.7)来生成PHP代码。
我用严格的excape设置Velocity,这有点帮助:
p.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT_ESCAPE, "true");
但是我遇到了模板中以下行的问题:
\$result['${attribute.Name}'] = \$this->${attribute.Name};
输出是:
$result['${attribute.Name}'] = $this->color;
但它应该是:
$result['color'] = $this->color;
编辑:
我找到了解决问题的方法:
#set($d = "$")
${d}result['${attribute.Name}'] = \$this->${attribute.Name};
但是我不喜欢引入额外变量的解决方案只是为了解决Velocity中可能存在的错误。
答案 0 :(得分:0)
在Velocity 1.7中,\
不再是转义字符。渲染\$result['${attribute.Name}']
时,\
是逐字打印的,因为它不是Velocity语法字符,$result['${attribute.Name}']
被识别为$result
变量引用的对象上的数组访问,但是因为该变量后面没有数组,所以整个输出都是逐字打印的。这就是Velocity的工作方式:无论被识别为有效的Velocity语法,但无法评估或导致null
,都会打印回输出。
由于您正在混合两种类似的语法,Velocity和PHP,因此您需要一种方法来区分另一种语法。逃生是正确的方法,但\$
不是一个。您必须使用变量来获取$
符号。
推荐的方法是使用$escapetool.d
转义工具,但这需要配置工具,而不仅仅是${d}
。
或者您可以使用unparsed content转义语法:
#[[$result[']]#${attribute.Name}#[['] = $this->]]#$attribute.Name