我有一个简单的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
似乎没问题,但它不会取代任何这些代码:) ;) :(
怎么了 ?
答案 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;