如何在字符串与搜索完全匹配时替换文本

时间:2013-05-12 23:54:09

标签: javascript

我使用以下代码从聊天文字中删除字词:

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'返回''。

3 个答案:

答案 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], ''); }