0

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

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

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

4

2 回答 2

1

正则表达式文字 ( /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];
    });
}
于 2013-11-15T05:27:27.003 回答
0

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

for (var key in smiles) {
    while (text.indexOf(key) > -1) {
        text = text.replace(key, smiles[key]);
    }
}
return text;
于 2013-11-15T05:38:22.053 回答