2

我很遗憾使用小胡子式下划线模板插值,因为它与我的 django 模板冲突。

我想在不破坏现有代码的情况下开始使用默认插值设置。

我可以_尊重两个插值正则表达式而不在它们之间显式切换吗?

小胡子正则表达式:/\{\{(.+?)\}\}/g

我试过匹配原来的 + 小胡子,但没有成功。

/(?:\{\{(.+?)\}\})|(?:\<\%\=(.+?)\%\>)/g

我劣质的正则表达式技能使我无法弄清楚这是否可能。

4

1 回答 1

3

如果您查看_.templateimplementation,您将看到问题的根源:

_.template = function(text, data, settings) {
  //...
  // Combine delimiters into one regular expression via alternation.
  var matcher = new RegExp([
    (settings.escape || noMatch).source,
    (settings.interpolate || noMatch).source,
    (settings.evaluate || noMatch).source
  ].join('|') + '|$', 'g');
  //...
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {

所以_.template期望三个模板分隔符表达式中的每一个都包含一个捕获组;占位符noMatch只是/(.)^/这样它不会匹配任何东西,但它仍然包含必要的捕获组。您的尝试包含两个捕获组,如下所示:

/(?:\{\{(.+?)\}\})|(?:\<\%\=(.+?)\%\>)/g
//       ^^^                 ^^^

第二<%=...%>组是你的麻烦背后。

你可能可以摆脱这个:

/(?:\{\{|<%=)(.+?)(?:%>|\}\})/g

但这会将诸如<%= pancakes}}和之类的东西{{pancakes %>视为模板表达式。不过,我认为您不必担心类似的事情。

也就是说,您应该能够通过一些非常简单的正则表达式工作将您的模板自动更新为您喜欢的样式,只需通过您最喜欢的工具版本发送所有模板:

s/\{\{(.+?)\}\}/<%= $1 %>/g

在 JavaScript 中,您将拥有:

// read your template into old_school
new_school = old_school.replace(/\{\{(.+?)\}\}/g, '<%= $1 %>');
// replace your template with the content of new_school

这样您就不必担心上面的时髦正则表达式或有两组分隔符。

于 2012-10-03T05:15:24.847 回答