我解决了字符串中标记替换的问题,例如: “你好,#name!”应该评价为:“你好,约翰!” 我测试了基于regexp的算法,它工作正常。问题是,当我尝试添加标签以动态搜索时,它以某种方式不被解析。 所有代码:
var replaceTags = function(str, tags) {
var tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" };
var result;
var tagNames = Object.keys(tags);
for(var i = 0; i < tagNames.length; i++) {
var subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$");
result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);
}
result = result.replace(RegExp("##", "g"), "#");
return result;
};
问题出在这一行:
result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);
不知何故,字符串没有正确连接。例如,将行更改为:
result = str.replace(RegExp(tagPattern.search + "name", "g"), tagPattern.copy + subDollarEscaped);
根据doc,Object.keys()应该返回字符串数组,但它看起来不是。我制作了控制台输出以确保标签“name”
tagPattern.search + tagNames[i]
真的评估为
(^|[^#])((##)*)#name
所以我真的很困惑。
答案 0 :(得分:2)
以下是基于您的代码的代码段,它似乎有效。
var str = 'Hello there #name, occupant of room #room!',
tags = {
name:'Fomin',
room:'123'
},
tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" },
result=str,
tagNames = Object.keys(tags),
subDollarEscaped ;
for(var i = 0; i < tagNames.length; i++) {
subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$");
result = result.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);
}
result = result.replace(RegExp("##", "g"), "#");
console.log('result:'+result);
&#13;
区别在于我将str
分配给result
开始,然后为result
分配替换结果。