underscore.template的_.templateSettings的正确胡子模板配置是什么?

时间:2013-01-10 21:00:49

标签: javascript regex underscore.js mustache

我四处搜寻,找不到真正有效的。

在Mustache中,当你掷出2个卷曲时,里面的字符串将被转义,如果你扔3,它就不会。

// when you pass {foo: '"bar"'} as hash, the following template will be: 
 {{foo}}  // => "bar"
{{{foo}}} // => "bar"

正确?所以我创建了以下内容。

http://jsfiddle.net/beatak/6s5PU/

,这显示插值和逃避相反,意味着未转义为未转义的3卷曲。当我在escape中的interpolate_.templateSettings之间切换时,它就无效了。为什么?下划线模板优先于这三个(escapeinterpolateevaluate)?

我知道我现在在jsfiddle上忽略了evaluate,如果这种方法一起工作会很棒,但是现在,我想让2和3卷曲的作品很好......

1 个答案:

答案 0 :(得分:2)

搜索转义的正则表达式,然后进行插值,然后求值。这就是为什么您的转义表单{{ }}在未转义的表单{{{ }}}之前匹配的原因。您可以在_.template

的来源中自行更改订单
var matcher = new RegExp([
  (settings.escape || noMatch).source,
  (settings.interpolate || noMatch).source,
  (settings.evaluate || noMatch).source
].join('|') + '|$', 'g');

更改上述行的顺序将改变优先级。

如果您不想更改下划线优先级,则可以使用更复杂的转义正则表达式。如果没有消极的后视,这很棘手,但我提出了:

/\{\{([^\{\}]+?)(?!\}\}\})\}\}/

应该表示:{{,后面跟着一个或多个非大括号字符,后面跟不上三重括号(}}}),然后是双重大括号}}。它适用于你的小提琴,希望能为你效劳。