0

我正在使用以下代码从聊天文本中删除单词:

for(var i =0; i <db.banned_words.length ;i++){
    cleaned_msg = cleaned_msg.replace(new RegExp(db.banned_words[i], 'g'), '');
}

问题是如果cleaned_msg 只有一个被禁止的词,它不会将它从clean_msg 中删除。

前任; clean_msg = '鸭子' ; 如果duck是禁用词之一,那么在替换之后,cleaned_msg应该是'',但它是'duck'。

如果cleaned_message 有任何其他空格或字符,它工作正常。前任; 鸭子返回'ie';'鸭'返回''。

4

3 回答 3

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, '');
于 2013-05-13T00:12:02.753 回答
1

Myabe 当您在页面加载时编译正则表达式并稍后使用它时,您可以获得一些性能优势。还要使它不区分大小写和多行。然后有一个问题,当你的禁用词数组有一个在正则表达式中被认为是特殊字符的字符时,你的替换将不会像它应该的那样运行:

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();
于 2013-05-13T00:12:29.157 回答
-1

如果 db.banned_words 是一个字符串(单词)数组,那么您需要做的就是 clean_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], '');
}

document.getElementById('output').value = cleaned_msg;

于 2013-05-13T00:17:45.027 回答