我怎么能做一个jQuery发誓词/坏词filter?

我知道有很多争论为什么这是一个坏主意,但在我的实现中,我计划在帐户设置中启用/禁用坏词。 换句话说,默认情况下会显示坏词,但如果询问则会关闭/隐藏。

计划是将JSON字符串发送到客户端,让客户端过滤掉坏字。

json字符串

['swear1', 'swear2'] 

原来的短语

 this phrase includes swear1 

最终输出

 this phrase includes **** 

这是我到目前为止所尝试过的

  $(document).ready (function () { $('body').html().replace('asdf', 'ffff'); }); 

现在请注意,我正在使用asp.net mvc而我“可以”在服务器端执行此操作,但我认为如果卸载到客户端会更好…我对这方面的建议持开放态度。

这样的事情可能有用:

 String.prototype.repeat = function(num){ return new Array(num + 1).join(this); } var filter = ['ass', 'piss']; $('.post').text(function(i, txt){ // iterate over all words for(var i=0; i 

关于jsFiddle的工作示例

编辑 :添加边界,以便它不会替换包含咒骂词的单词。 我使用了双反斜杠,因为反斜杠应该以字符串forms转义, 请参阅此主题 。

这是一个轻量级的function。

 var filterWords = ["fool", "dumb", "shit", "ass", "couch potato"]; var rgx = new RegExp(filterWords.join("|"), "gi"); function wordFilter(str) { return str.replace(rgx, "****"); } 

所以我采用了@Harmen给出的基本建议,并将其扩展为jQuery插件。 这似乎是我可能想出的最佳实现。

jQuery.profanityFilter

 $(document).profanityFilter({ replaceWith:'#', customSwears: ['ass'], externalSwears: '/swearWords.json' }) 

将服务器从服务器移动到客户端时,必须始终考虑带宽与处理成本。 当然,在客户端使用它可以最大限度地降低处理成本,但是你会浪费大量时间将坏词列表移动到客户端。

此外,在服务器上使用它可以使您能够预处理post,例如,只在规则更改时更新它,从而节省更多的处理时间。

您返回的JSON对象不能具有重复的属性名称。 而不是{ w: 'Swear1', w: 'Swear2' }它应该是[ 'Swear1', 'Swear2' ]

您可以解析文本以过滤并使用特定的类属性在标记之间包含每个出现的单词,并使用函数切换它们。 这应该是一个简单的方法。

你需要迭代所有单词:对于每个单词,在用星号替换之前检查它是否是你禁止的单词之一。

为了有效地执行此操作,您需要将单词存储在哈希表中:

 var badWords = { hello: true, goodbye: true, }; 

迭代每个单词,然后查看它是否在哈希表中。 (对包含“单词”的内容的解释会有所不同,具体取决于您是否只是在寻找由空格或其他非字母字符包围的字符。)

 // Pseudocode for each word in content { if (badWords[word]) { // replace word with word.length * characters } }