Javascript 胡须格式的主干线/下划线模板导致#磅/哈希符号出错?

Javascript 胡须格式的主干线/下划线模板导致#磅/哈希符号出错?,javascript,regex,backbone.js,underscore.js,mustache,Javascript,Regex,Backbone.js,Underscore.js,Mustache,我正在使用主干线的下划线模板引擎和胡子格式模式 我已经在项目的其他地方成功地使用了它,但是现在我第一次使用来自mustache的循环列表模式来填充模板,这会抛出一个我有点困惑的错误。 chrome中的错误是: "Uncaught SyntaxError: Unexpected token ILLEGAL" 并指向backtrace中的下划线模板函数,这非常无用,但在firebug中,我得到了一个更有用的错误,如下所示: 建议散列符号“#”是个问题,这是有道理的,因为我知道小胡子可以正常工作,

我正在使用主干线的下划线模板引擎和胡子格式模式

我已经在项目的其他地方成功地使用了它,但是现在我第一次使用来自mustache的循环列表模式来填充模板,这会抛出一个我有点困惑的错误。 chrome中的错误是:

"Uncaught SyntaxError: Unexpected token ILLEGAL"
并指向backtrace中的下划线模板函数,这非常无用,但在firebug中,我得到了一个更有用的错误,如下所示:

建议散列符号“#”是个问题,这是有道理的,因为我知道小胡子可以正常工作,因为项目的许多其他部分都很好地使用它,这也是我第一次在我的模板中使用hash sybol。它看起来可能与循环功能或下划线的插值/模板设置有关

以下是我的模板的相关部分:

<div class="thumblist thumblistleft" id="currentprojectslist">
    <div class="thumb-list-header">
         <h2>current projects</h2>
    </div>
    <div class="thumb-list-area">
        <ol>
        {{#worklist}}       <!----- LOOK HERE --->
            {{#current}}
              <li><a>{{title}}</a></li>
            {{/current}}
        {{/worklist}}
        </ol>
    </div>
</div>
_.templateSettings = {
     evaluate : /\{\[([\s\S]+?)\]\}/g,
     interpolate : /\{\{([\s\S]+?)\}\}/g
};
我最初在这里遵循此示例以供参考:

现在我认为问题可能出在这里:

Underline.js建议在呈现胡子模板之前使用此选项:

<div class="thumblist thumblistleft" id="currentprojectslist">
    <div class="thumb-list-header">
         <h2>current projects</h2>
    </div>
    <div class="thumb-list-area">
        <ol>
        {{#worklist}}       <!----- LOOK HERE --->
            {{#current}}
              <li><a>{{title}}</a></li>
            {{/current}}
        {{/worklist}}
        </ol>
    </div>
</div>
_.templateSettings = {
     evaluate : /\{\[([\s\S]+?)\]\}/g,
     interpolate : /\{\{([\s\S]+?)\}\}/g
};
此外:

也只是插入语句,我两者都试过了。然而,我的正则表达式知识真的很差,我有一种感觉,它可能无法容纳散列?无论如何。。。。我完全被难住了。 有人能帮我吗

甚至可以这样循环吗?查看下划线源代码,我不确定:


非常感谢

为了其他面临此问题的人,我发布此帖子。 在谷歌搜索了很多次都没有结果之后,我仔细浏览了underline.js源代码,基本上你要么使用underline的模板语法,要么在JSON中写入丑陋的函数处理器,要么在源代码中包含mustache.js并调用:

Mustache.render(mytemplate,mymodel)
并预见到

_.template(..) function

烦人但不管怎样,我希望这能帮助今天遇到这个问题的人。问题似乎在于下划线执行模板的顺序:转义、插值,然后求值。因此,您需要在插值正则表达式中显式忽略
{{{#
的任何匹配:

_.templateSettings = {
  evaluate:    /\{\{#([\s\S]+?)\}\}/g,            // {{# console.log("blah") }}
  interpolate: /\{\{[^#\{]([\s\S]+?)[^\}]\}\}/g,  // {{ title }}
  escape:      /\{\{\{([\s\S]+?)\}\}\}/g,         // {{{ title }}}
}
它实际上与mustach的工作方式不同:下划线的模板中没有合适的块,因此不需要关闭块
{{/}
。您只需要像使用标准下划线模板一样匹配语句。

我没有使用#符号,但我在尝试使用三重胡须
{{{{name}}}
来设置未替换的值时遇到了类似的错误:

interpolate : /\{\{\{(.+?)\}\}\}/g,
escape : /\{\{(.+?)\}\}/g,
如果这就是你来这里的原因,下面的设置很有效

interpolate : /\{\{\{(\s*\w+?\s*)\}\}\}/g,
escape : /\{\{(\s*\w+?\s*)\}\}(?!\})/g,

我尝试了Max的格式,但这对我不起作用,因为我混合了两个和三个mustache表达式,虽然三个表达式工作得很好,但它从两个mustache中的变量名的每一端剥离了一个字符,即
{{title}
导致下划线,查找名为
itl的变量

模式
/{([\s]+?)\}/g
将匹配
{{{foo}
并捕获
{foo
。使用
/{{35;([\ s]+?)可以避免捕获哈希/g
,尽管我认为这会导致其他问题。你有没有尝试过这样循环?我真的很想,在下划线中写出一个简单的if,跨越多个求值行来检查我的JSON中是否存在一个标志,这是非常烦人的。嘿,遗憾的是,下划线不能在本机上实现它,你必须包括mustache.js和do mustache.render,如下所示下面..这真的很烦人我同意我来这里是为了最初的问题,按照答案,这个正则表达式对我很有效,谢谢!如果有人遇到这个:
{{title}
导致下划线搜索名为
itl
的变量,这实际上是Niyaz在Max的问题下面指出的:在表达式和大括号之间添加空格,它就会工作。因此,您需要编写
{title}而不是
{title}
。注意,使用上述语法,您应该确保表达式和
{{}
之间有空格。例如:
{{test}}
将起作用,
{{test}}
将不起作用。