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

innerhtml.replace not replacing all words in array javascript

本文关键字:单词 javascript 数组 replace 替换 innerhtml      更新时间:2023-09-26

我正在尝试制作一个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]);
}

它只替换数组的前几对,而不替换后几对。例如,如果我"aa是bb是yy",它只更改为"b是c是yy","yy"不变。如何使它替换数组中的所有单词?

根据ECMA脚本规范,replace()不接受数组作为替换参数,但允许使用函数。该函数获取参数的变量计数:匹配的子串组(变量)第一个匹配的偏移索引初始字符串

我的方法使用一个matcher和一个mather函数,该函数有条件地将匹配替换为替换。该对是从对象映射搜索字符串中选择的,以进行替换。如果找不到搜索字符串,则返回匹配的字符串,结果不变。

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

Humm您的代码似乎可以工作

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>