2012-12-23 69 views
2

我需要一個匹配某個字符串的正則表達式,並用符號替換它的每個字母。Swear Filter正則表達式

所以... "Cheese"將被"******"被替換,但"Pie"將由"***"

因此,例如更換:

"my pie is tasty and so is cake".replace(new RegExp(/(pizza|cake|pie|test|horseshoe)/gi), "'*' x length($1)") 

(顯然,替代不存在)

+9

請閱讀http://en.wikipedia.org/wiki/Clbuttic和http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-在添加這樣的過濾器之前,需要intercoursing-bad-idea.html。 – ThiefMaster

+1

lol @「buttbuttinate」 – jbabey

+0

另請參閱[本堆棧溢出答案](http://stackoverflow.com/a/6099598/58792)最徹底的解釋爲什麼這是一個死胎的想法。如果你過濾* pie *,人們會使用*рie*或*pіe*,或者* pi * *,* *或*,或者其他幾千個其他技巧中的任何一個。 (你沒有看到這兩者之間的區別嗎?準確地說!但是你的正則表達式會。) –

回答

5

個人我認爲這是一個非常糟糕的主意,因爲:

  • 它會破壞有效的文本,這可能會干擾有效的用戶。
  • 使用拼寫錯誤很容易欺騙過濾器,所以它不會阻止惡意用戶。

但是解決你的問題,你可以通過一個函數來代替:

var regex = /(pizza|cake|pie|test|horseshoe)/gi; 
var s = "my pie is tasty and so is cake"; 
s = s.replace(regex, function(match) { return match.replace(/./g, '*'); }); 
+1

還要注意Scunthrope問題的警告。 –

+0

@JanDvorak:注意。查看更新。 –

0

爲了防止上述classic issue通過@ThiefMaster您可以考慮添加文字邊界的格局。但是請記住,您仍然需要處理這些單詞的複數形式和拼寫錯誤。

var str = 'pie and cake are tasty but not spies or protests'; 
str = str.replace(/\b(pizza|cake|pie|test|horseshoe)\b/gi, function (match) { 
    return match.replace(/\w/g, '*'); 
});