2

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

在 Mustache 中,当你抛出 2 curly 时,里面的字符串将被转义,如果你抛出 3,它不会。

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

对?所以我创建了以下内容。

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

这显示了相反的插值和转义,这意味着未转义的 2 卷曲 3 转义的。当我在escape和之间切换interpolate_.templateSettings,它不起作用。为什么?下划线模板优先于这三个 ( escape,interpolateevaluate)?

我知道我现在忽略evaluate了 jsfiddle,如果它一起工作那将是很棒的,但现在,我想让 2 和 3 卷曲工作得很好......</p>

4

1 回答 1

2

搜索转义的正则表达式,然后插值,然后评估。这就是为什么您的转义形式{{ }}在您的未转义形式之前匹配{{{ }}}。您可以在源代码中自行更改顺序_.template

var matcher = new RegExp([
  (settings.escape || noMatch).source,
  (settings.interpolate || noMatch).source,
  (settings.evaluate || noMatch).source
].join('|') + '|$', 'g');

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

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

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

这应该意味着:{{,后跟一个或多个非大括号字符,后面不应跟三花括号 ( }}}),后跟双花括号}}。它适用于您的小提琴,希望对您有用。

于 2013-01-21T22:56:04.857 回答