innerhtml.replace不替换数组javascript中的所有单词

时间:2016-03-26 19:17:44

标签: javascript google-chrome

我试图制作一个用另一个词替换一个词的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;没有改变。 我如何使它取代数组中的所有单词?

2 个答案:

答案 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>