Apache Velocity:逃避字符不适用于PHP作为关联数组键

时间:2013-07-29 09:52:41

标签: java php templates velocity

我正在使用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中可能存在的错误。

1 个答案:

答案 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