我使用以下代码从聊天文字中删除字词:
for(var i =0; i <db.banned_words.length ;i++){
cleaned_msg = cleaned_msg.replace(new RegExp(db.banned_words[i], 'g'), '');
}
问题是如果cleaning_msg只有一个被禁止的单词,则不会将它从cleaning_msg中删除。
离; cleaning_msg ='duck';如果duck是被禁止的单词之一,那么,在替换之后,cleaning_msg应该是'',但它是'duck'。
如果cleaning_message有任何其他空格或字符,它可以正常工作。前; duckie返回'ie'; 'duck'返回''。
答案 0 :(得分:2)
你的方法应该有效,所以你的问题可能就在其他地方。不过我可以建议你采用不同的方法吗?
var banned_words = ['duck', 'cool', 'test'],
banned_words_rx = new RegExp('\\b(' + banned_words.join('|') + ')\\b', 'gi');
'this duck is very cool, so cool that I used it to test this thing'.replace(banned_words_rx, '');
答案 1 :(得分:1)
Myabe在页面加载并稍后使用时编译正则表达式时可以获得一些性能优势。也使它不区分大小写和多行。然后有一个问题,当你的被禁止的单词数组有一个在regexp中被认为是特殊字符的字符时,你的替换将不会像它应该的那样:
var replacer={
bannedR=[],
init:function(){
for(var i =0; i <db.banned_words.length ;i++){
replacer.bannedR.push(new RegExp(db.banned_words[i]
.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1')
.replace(/\x08/g, '\\x08'), 'igm');
}
},
replace:function(msg){
var i;
for(i=0;i<replacer.bannedR.length;i++){
msg=msg.replace(replacer.bannedR[i],'');
}
return msg;
}
}
replacer.init();
答案 2 :(得分:-1)
如果db.banned_words是一个字符串(单词)数组,那么你需要做的就是cleaning_msg.replace(db.banned_words [i],'');
http://jsfiddle.net/ijackson/yjV3e/
var banned_words = ['badword','duck'];
var cleaned_msg = "This is a long string containing a few bad words such as badword and duck";
for(var i =0; i <banned_words.length ;i++){
cleaned_msg = cleaned_msg.replace(banned_words[i], '');
}
for(var i =0; i <banned_words.length ;i++){
cleaned_msg = cleaned_msg.replace(banned_words[i], '');
}