Javascript执行维护状态
我目前正在尝试用Javascript构建一个小的模板引擎,用find替换html5标记中的标记,并用regex替换 我在正则表达式上使用exec,并循环处理结果。我想知道为什么正则表达式在它的当前形式中有/g标志,但是没有它就可以了 检查中断的示例并删除正则表达式上的/g标志以查看正确的输出Javascript执行维护状态,javascript,regex,Javascript,Regex,我目前正在尝试用Javascript构建一个小的模板引擎,用find替换html5标记中的标记,并用regex替换 我在正则表达式上使用exec,并循环处理结果。我想知道为什么正则表达式在它的当前形式中有/g标志,但是没有它就可以了 检查中断的示例并删除正则表达式上的/g标志以查看正确的输出 var TemplateEngine = function(tpl, data) { var re = /(?:<|<)%(.*?)(?:%>|>)/g, mat
var TemplateEngine = function(tpl, data) {
var re = /(?:<|<)%(.*?)(?:%>|>)/g, match;
while(match = re.exec(tpl)) {
tpl = tpl.replace(match[0], data[match[1]])
}
return tpl;
}
var TemplateEngine=函数(tpl,数据){
变量re=/(?:|)g,匹配;
而(match=re.exec(tpl)){
tpl=tpl.replace(匹配[0],数据[匹配[1]]
}
返回第三方物流;
}
有没有人能给我解释一下,为什么我的例子完全是这样的:
<p><%more%></p>
检查此链接。使用g标志时,存储正则表达式的对象(re)将跟踪上次匹配在lastIndex
属性中的位置,下次使用该对象时,搜索将从lastIndex
的位置开始
要解决此问题,您可以每次手动重置lastIndex
属性,也可以不在对象中保存正则表达式并将其内联使用,如下所示:
while(match = /(?:<|<)%(.*?)(?:%>|>)/g.exec(tpl)) {
while(匹配=/(?:|))/g.exec(tpl)){
中解释了原因
您需要的解决方案实际上是一个字符串。用回调替换:
var TemplateEngine = function(tpl, data) {
var re = /(?:<|<)%(.*?)(?:%>|>)/g, match;
return tpl.replace(re, function($0, $1) {
return data[$1] ? data[$1] : $0;
});
}
var TemplateEngine=函数(tpl,数据){
变量re=/(?:|)g,匹配;
返回tpl.replace(re,函数($0,$1){
返回数据[$1]?数据[$1]:$0;
});
}
见
在这里,正则表达式按顺序查找字符串中所有不重叠的匹配项,并将匹配项传递给回调方法。$0
是完全匹配项,$1
是组1内容。如果数据[$1]
存在,则使用它替换整个匹配项,否则,将整个匹配项插回