0

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

4

1 回答 1

0

在 Velocity 1.7 中,\不再是转义字符。渲染时\$result['${attribute.Name}']\将逐字打印,因为它不是 Velocity 语法字符,$result['${attribute.Name}']因此被识别为对变量引用的对象的数组访问$result,但由于该变量后面没有数组,因此将逐字打印整个输出。这就是 Velocity 的工作原理:任何被识别为有效的 Velocity 语法,但不能被评估或导致 a 的null内容都被打印回输出中。

由于您混合了两种相似的语法,即 Velocity 和 PHP,因此您需要一种方法来分隔另一种。逃生是正确的方法,但\$不是。您必须使用变量来获取$符号。

推荐的方法是使用$escapetool.d转义工具,但这需要配置工具,而且比${d}.

或者您可以使用未解析的内容转义语法:

#[[$result[']]#${attribute.Name}#[['] = $this->]]#$attribute.Name
于 2013-07-30T11:29:15.177 回答