全局替换不起作用,但简单替换工作正常

时间:2013-11-15 05:25:40

标签: 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]);
}
在控制台中

我有:

/:)/g
/;)/g
/:(/g

似乎没问题,但它不会取代任何这些代码:) ;) :( 怎么了 ?

2 个答案:

答案 0 :(得分:1)

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

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

var r = new RegExp(key, 'g');

这就是你将得到与括号相关的错误的点。 You can escape your values to put in a regular expression - 以最好的方式组合在一起,它可能看起来像这样:

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];
    });
}

答案 1 :(得分:0)

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

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