PHP中的Mustache.js会保留无法呈现的标记吗?

时间:2015-03-16 11:36:17

标签: mustache mustache.php

我得到了以下内容:

{{#lang}}Dear{{/lang}} {{customer.ship_firstname}},<br />
{{#lang}}Thank you for ordering from{{/lang}} <a href="{{shop.URL}}">{{shop.name}}</a>.

现在我使用以下设置运行渲染:

$m = new Mustache_Engine(
                        array(
                        'helpers' => array(
                            'lang' => function($text) {
                                return __($text); // i18n translation
                            }),
                        'charset' => 'UTF-8'
                        )
                    );
$data = array();
echo $m->render($input, $data);

输出:

Dear ,<br />
Thank you for ordering from <a href=""></a>.

我想保留无法呈现的标记。如上所述,当$ data没有customer.ship_firstnameshop.URL的数据时,渲染的数据仍然应该包含{{customer.ship_firstname}}.

是否有禁用/启用此胡子设置?

我想要的输出如下:

Dear {{customer.ship_firstname}},<br />
Thank you for ordering from <a href="{{shop.URL}}">{{shop.name}}</a>.

1 个答案:

答案 0 :(得分:1)

简短的回答是不,这是不可能的,原因很多。

答案越长,你提出错误的问题;)

它被称为the XY problem。你可能会更好地问“我想要完成X.我尝试了Y而这似乎不起作用。我怎么能完成X?”

所以,我假设您要问“我想在Mustache模板中只渲染一些标签,例如,在服务器上的Mustache.php中,以便我可以稍后再渲染,例如在浏览器中的Mustache.js中。我尝试使用部分数据进行渲染,但它没有保留未渲染的标记。如何部分渲染Mustache模板?“

您最好的选择可能是使用Set Delimiter tags使用两组明确的标记来呈现您的模板。它看起来像这样:

{{=[[ ]]=}}
[[# lang ]]Dear[[/ lang ]] {{ customer.ship_firstname }},<br />
[[# lang ]]Thank you for ordering from[[/ lang ]] <a href="{{ shop.URL }}">{{ shop.name }}</a>.

然后,在第一次传递时,它会替换所有[[ ]]标记,并留下:

Dear {{ customer.ship_firstname }},<br />
Thank you for ordering from <a href="{{ shop.URL }}">{{ shop.name }}</a>.

请注意,如果您进行双遍渲染,则必须绝对确定您信任第一遍的输出。如果您将用户数据放在那里,那么他们完全有可能使用“小胡子注入”攻击并做一些邪恶的事情。在你的情况下,看起来数据来自翻译字符串,所以你可能没问题,但是这个说明也适用于其他人做同样的事情。