我试图制作一个用另一个词替换一个词的chrome扩展名。
例如,如果我有:
var rep = [['aa','b'],['bb','c']...['yy','z']];
var len = 26;
for(i = 0; i <len; i++){
document.body.innerHTML=document.body.innerHTML.replace(new RegExp("\\b"+rep[i][0]+"\\b","gi"),rep[i][1]);
}
...它只替换数组的前几对,但不替换后一对。 例如,如果我有 &#34; aa是bb是yy&#34;, 它只会变为 &#34; b是c是yy&#34;,&#34; yy&#34;没有改变。 我如何使它取代数组中的所有单词?
答案 0 :(得分:0)
According to the ECMA Script spec replace()
不会将数组作为替换参数,但允许使用函数。该函数获得一个可变的参数计数:匹配的子字符串,组(变量),第一个匹配的偏移索引和初始字符串。
我的方法使用一个匹配器和匹配器功能,有条件地用匹配替换匹配。从对象映射搜索字符串中挑选该对以替换。如果未找到搜索字符串,则返回匹配的字符串,结果不会发生变化。
var replMap = {
// specify search tokens as lowercase!
xx: "A",
yy: "B",
zz: "C"
},
str = "xx is yy is zz";
str.replace(/\b([a-z]+)\b/gi, function(match, g1, offset, string) {
// get replacement by matched group value, fall back to value
return replMap[g1.toLowerCase()] || g1;
});
// > "A is B is C"
replMap
结构用于方便起见。我认为可以用这种方式创建它。如果没有,可以更改该函数(本答案中未提供),或者可以使用reduce()
将数组数组转换为映射:
var rep = [["xx", "AA"], ["yy", "BB"], ["zz", "CC"]],
replMap = rep.reduce(function(map, arr) { map[arr[0]] = arr[1]; return map; }, {});
有关具有替换功能的replace()
的更多信息,请访问Mozilla开发人员网络:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter
答案 1 :(得分:0)
嗯,你的代码似乎有用Ô_o:
var arr = "abcdefghijklmnopqrstuvwxyz".split('');
var rep = arr.map(function(a, i) {
return [a+a,arr[i+1]];
});
var len = rep.length,
str = document.body.innerHTML;
for(i = 0; i < len; i++){
str = str.replace(new RegExp("\\b" + rep[i][0]+"\\b","gi"), rep[i][1]);
}
document.body.innerHTML = str;
<body>
aa is a bb is a yy
</body>