我是regex
的新手并正在练习它。首先看看这段代码:
$(".app").each(function(){
var raw_string = $(this).html();
var changed_string = raw_string.replace(/^\{\{|\}\}$/g, "");
$(this).html(eval(changed_string));
});
我正在尝试查看.app
的HTML并搜索以胡须{{
开头且以胡须}}
结尾的任何内容。就像Mustache.js
一样。首先,我将其替换为空字符串,然后将.app
的HTML设置为eval(changed_string)
。所以,如果我尝试:
<div class="app">
{{2+2}}
</div>
完美打印4.但是:
如果我向.app
添加一些额外的HTML:
<div class="app">
2 and 2 are: {{2+2}}
</div>
输出结果为:
2 and 2 are: {{2+2}}
答案 0 :(得分:4)
修复表达式(你匹配字符串的开头/结尾)仍然无法解决问题;你会尝试评估整个字符串,包括“2和2是:......”。
试试这个,替换每个{{...}}
对中的内容:
$(".app").each(function(){
var raw_string = $(this).html();
var changed_string = raw_string.replace(/\{\{(.+)\}\}/g,
function( match, p1 ) {
return(eval(p1));
}
);
$(this).html(changed_string);
});
答案 1 :(得分:0)
问题是你的.replace(...)没有捕捉到胡须之间的东西,它只是删除胡须。因此,在第二种情况下,您将尝试评估字符串而不是有效表达式,即eval("2 and 2 are: 2+2");
修复是针对捕获组()
的.exec或.match,并提取捕获的字符串以进行评估。
$(".app").each(function(){
var raw_string = $(this).html();
var reg = new RegExp(/\{\{(.*)\}\}/);
var formula = reg.exec(raw_string); // captures orig string in formula[0], first match in formula[1]
$(this).html(eval(formula[1]));
});