2

私は周りを検索しましたが、本当に機能するものを見つけることができませんでした。

ムスタッシュでは、カーリーを2回投げると中の紐が抜け、3回投げると抜けません。

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

右?というわけで以下を作成しました。

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

これは補間とエスケープの反対を示しており、エスケープされていない場合は 2 カーリー、エスケープされている場合は 3 を意味します。と を切り替えるescapeinterpolate、うまくいき_.templateSettingsません。なぜ?アンダースコア テンプレートは、これら 3 つ ( escapeinterpolateおよびevaluate) よりも優先されますか?

私はevaluate今jsfiddleを無視していることを知っています.それが一緒に機能するならそれは素晴らしいことです.

4

1 に答える 1

2

エスケープの正規表現が検索され、補間されてから評価されます。そのため、エスケープされたフォーム{{ }}は、エスケープされていないフォームの前に一致します{{{ }}}。のソースで自分で順序を変更できます_.template

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

上記の行の順序を変更すると、優先順位が変更されます。

アンダースコアの優先度を変更したくない場合は、より複雑なエスケープ正規表現を使用できます。ネガティブな裏返しなしで行うのは難しいですが、私は思いついた:

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

これは、次のことを意味する必要があります。{{、その後に1つ以上の非中括弧}}}文字が続き、その後に三重中括弧( )が続き、その後に二重中括弧が続くことはありません}}。それはあなたのフィドルで機能し、うまくいけばあなたのために機能します。

于 2013-01-21T22:56:04.857 に答える