我怎么能做一个jQuery发誓词/坏词过滤器?

时间:2010-12-27 18:58:59

标签: jquery

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

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

json string

['swear1', 'swear2']

原始短语

this phrase includes swear1

最终输出

this phrase includes ****

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

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

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

6 个答案:

答案 0 :(得分:12)

这样的事可能有用:

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<filter.length; i++){

    // Create a regular expression and make it global
    var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

    // Create a new string filled with '*'
    var replacement = '*'.repeat(filter[i].length);

    txt = txt.replace(pattern, replacement);
  }

  // returning txt will set the new text value for the current element
  return txt;
});

在jsFiddle

上工作example

修改:添加了边界,因此不会替换包含咒骂词的单词。我使用了双反斜杠,因为反斜杠应该用字符串转义see this topic

答案 1 :(得分:4)

这是一个轻量级的功能。

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

答案 2 :(得分:3)

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

jQuery.profanityFilter

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

答案 3 :(得分:1)

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

此外,在服务器上使用它可以让您预先处理帖子,并且只在规则更改时更新它,从而节省更多的处理时间。

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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

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

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

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

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