Javascript 全局替换不';不起作用,但简单的替换很好

Javascript 全局替换不';不起作用,但简单的替换很好,javascript,Javascript,我有一个简单的smily解析器代码: for (var key in smiles) { text = text.replace(key , smiles[key]); } return text; 所以问题是,这只会替换第一个,所以我切换到全局替换 for (var key in smiles) { var r = '/'+key+'/g'; console.log(r); text = text.replace(r , smiles[key]); } 在控制台中,我

我有一个简单的smily解析器代码:

for (var key in smiles) {
  text = text.replace(key  , smiles[key]);
}
return text;
所以问题是,这只会替换第一个,所以我切换到全局替换

for (var key in smiles) {
  var r =  '/'+key+'/g';
  console.log(r);
  text = text.replace(r  , smiles[key]);
}
在控制台中,我有:

/:)/g
/;)/g
/:(/g
这似乎还可以,但它不会取代这些代码中的任何一个
:;):(

怎么了?

正则表达式文字(
/foo/g
)与看起来像正则表达式文字(
“/foo/g”
)的字符串不同

您可以使用
RegExp
构造函数动态创建正则表达式:

var r = new RegExp(key, 'g');
在这一点上,你会得到与括号相关的错误。-用最好的方式放在一起,它可能看起来像这样:

function escapeRegex(text) {
    return text.replace(/[[{}()*+?.\\^$|]/g, "\\$&");
}

function replaceAll(str, map) {
    var re = new RegExp(Object.keys(map).map(escapeRegex).join("|"), "g");

    return str.replace(re, function(m) {
        return map[m];
    });
}

只需在文本中循环并替换笑脸,直到不再出现:-

for (var key in smiles) {
    while (text.indexOf(key) > -1) {
        text = text.replace(key, smiles[key]);
    }
}
return text;

是的,我得到:Uncaught SyntaxError:Invalid regular expression:/:)/:Unmatched')“将map作为局部变量并调用map方法有点令人讨厌。Where
key=':\)”
您想要
r=new RegExp(key,'g')你应该提供一些解释。thanx,这有点过分了。。。至少我的浏览器认为。。。firefox和chromejust都试图为那些大脑不计算正则表达式的人(比如我的大脑)提供一个替代方案。。。