Twig - 使用引号作为连接过滤器的分隔符

时间:2012-07-19 08:40:49

标签: twig htmlspecialchars

我向模板传递了一个字符串数组,我希望将其转换为jaavascript数组:

控制器文件(php):

$myVar = array('a','b','c');

所需的HTML:

var myVar = ["a","b","c"];

我尝试以下代码(twig):

var myVar = ["{{ myVar | join('","') }}"];

但是twig生成器将引号转换为html实体,这就是结果:

var myVar = ["a","b","c"];

有些想法?

2 个答案:

答案 0 :(得分:5)

您需要应用raw过滤器:

var myVar = ["{{ myVar | join('","') | raw }}"];

答案 1 :(得分:0)

Maerlyn的答案将起作用,但是它的缺点是myVar数组中的值也将被原始输出,这取决于该变量的来源,可能导致您网站中的漏洞,例如作为XSS。

我找到了两种方法来保持数组值的转义。第一种是使用带有if语句的循环来检查它是否是最后一次迭代,以确定是否需要输出联接中使用的“胶水”:

var myVar = [{% for val in myVar %}"{{ val }}"{% if loop.last == false %},{% endif %}{% endfor %}]

第二种方法是让PHP您的PHP处理一切,包括转义,然后在Twig中输出原始字符串:

$arr = array_map(
    function($value) {
        return '"' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '"';
    },
    $arr
);
$myVar = '[' . implode(',', $arr) . ']';

然后将$myVar变量传递到您的视图,然后您可以执行以下操作:

{{ myVar|raw }}