2014-11-21 68 views
2

我有一個聊天應用程序,我想使用褻瀆過濾器。 http://jsfiddle.net/691nruoL/4/爲褻瀆過濾器優化代碼

var chatMessage = "sex it up what the fuck tits lol fuck titsss"; 

// Potentially an array of hundreds of words coming from a JSON file 
var badWords = ['sex', 'fUck', 'dick', 'penis', 'cum', 'tits', 'fuck']; 

for (var i = 0; i < badWords.length; i++) { 
    if (chatMessage.indexOf(badWords[i].toLowerCase()) !== -1) { 
     chatMessage = chatMessage.replace(badWords[i].toLowerCase(), pushAsterisksForWordLength(badWords[i].length)); 
    } 
} 

function pushAsterisksForWordLength(asterisksLength) { 
    var censoredWordArray = []; 
    for (var i = 0; i < asterisksLength; i++) { 
     censoredWordArray.push('*'); 
    } 
    return censoredWordArray.join(''); 
} 

console.log(chatMessage); 

那你怎麼優化它:

我已經來到了?我覺得陣容中有很多不好的話,可能會很慢。

+0

使用正則表達式??????? – 2014-11-21 08:15:40

+0

你將如何使用它? – 2014-11-21 08:16:46

+0

你「感覺」它可能會很慢?你真的測過它了嗎? – JJJ 2014-11-21 08:18:45

回答

0

Subsitiutes中有星號 「壞」 字中的每個字母,而不遍歷字:

chatMessage.replace(/sex|fuck|tits/gi,function(word){ 
return word.replace(/./g,'*') 
}); 

http://jsfiddle.net/691nruoL/5/

+0

您可以從數組中創建正則表達式,請參閱@ Amadan的答案。 – pawel 2014-11-21 08:45:39

+0

這對'sextant'將會失敗。事實上,擴大這個答案包括更多的詛咒詞會導致更多的問題。 – Rob 2016-03-20 22:37:47

+0

@Rob問題是如何優化基於OPs的循環解決方案,而不是如何創建一個褻瀆濾鏡。 – pawel 2016-03-21 09:36:11

4

使用正則表達式:

var chatMessage = "sex it up what the fuck tits lol fuck titsss"; 
var badWords = ['sex', 'fUck', 'dick', 'penis', 'cum', 'tits', 'fuck']; 
var regExpSource = badWords.join('|'); 
var regExpFilter = new RegExp(regExpSource, 'ig'); 

console.log(regExpFilter.test(chatMessage)); 

,並刪除星號的話像:

chatMessage.replace(regExpFilter, function() { 
    return '****';//Don't matter what that was a word 
}); 
+0

更好的是不要寫信息與'badWord'聊天,因爲這不會引起攻擊 – Pinal 2014-11-21 08:28:06

3
// Prepare for search (just once) 
var badWordsRE = new RegExp(badWords.join('|'), "gi"); 
var asterisks = ""; 
badWords.forEach(function(word) { 
    while (word.length > asterisks.length) asterisks += "*"; 
}); 

// Search and destroy 
chatMessage.replace(badWordsRE, function(word) { 
    return asterisks.substring(0, word.length); 
}); 
// => "*** it up what the **** **** lol **** ****ss"