如何进行jQuery脏话/脏话筛选?

如何进行jQuery脏话/脏话筛选?,jquery,Jquery,我知道这是一个坏主意的原因有很多争论,但在我的实现中,我计划在帐户设置中启用/禁用坏单词。换句话说,默认情况下,坏词是可见的,但如果被询问,则关闭/隐藏 计划是向客户端发送一个JSON字符串,让客户端过滤掉不好的单词 json字符串 ['swear1', 'swear2'] 原语 this phrase includes swear1 最终产量 this phrase includes **** 这就是我到目前为止所尝试的 $(document).ready (function (

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

计划是向客户端发送一个JSON字符串,让客户端过滤掉不好的单词

json字符串

['swear1', 'swear2']
原语

this phrase includes swear1
最终产量

this phrase includes ****
这就是我到目前为止所尝试的

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

现在顺便说一句,我正在使用asp.net mvc,我可以在服务器端做到这一点,但我认为如果卸载到客户端,这会更好。。。我愿意接受这方面的建议。

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


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

< P>当从服务器到客户端移动时,必须始终考虑带宽而不考虑处理成本。当然,将它放在客户端将使您的处理成本降到最低,但您将浪费大量时间将坏词列表移动到客户端


此外,将其安装在服务器上可能使您能够预处理帖子,例如,仅在规则更改时更新帖子,从而节省更多的处理时间。

类似的方法可能会奏效:

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;
});
String.prototype.repeat=函数(num){
返回新数组(num+1)。加入(this);
}
变量过滤器=['ass','piss'];
$('.post').text(函数(i,txt){
//迭代所有单词

对于(var i=0;i您需要迭代所有单词:对于每个单词,在用星号替换之前,请检查它是否是您的禁用单词之一

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

var badWords = {
    hello: true,
    goodbye: true,
};
迭代每个单词,然后查看它是否在哈希表中。(对“单词”的组成部分的解释会有所不同,这取决于您是否只查找由空格或其他非字母字符包围的字符。)


这里是一个轻量级函数

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

因此,我采纳了@Harmen给出的基本建议,并将其扩展为jQuery插件。这似乎是我可能想到的最好的实现


JSON字符串不正确,
w
不是唯一的…它应该是这样一个数组:
{“w”:[“sware”,“swear2”]}
尽管如此,这段代码仍然有clbuttic综合征,不是吗?这可能是不可取的,即使是选择性加入过滤器你也不能“坏词”过滤器从根本上说是一个有缺陷的想法,即使是最好的实现,每次都会让用户产生至少十几次误报。无论你提出什么,都会让用户烦恼上百次。另请参见:CLBUTIC。这两种方法都无法阻止愚蠢、懒惰的人侮辱他人。此外,客户端验证离子很容易被绕过。@Pekka,这就是过滤器“关闭”的原因默认情况下。然后每个人都会看到未经过滤的文本。他们会忘记系统有一个过滤器,他们不会说@$$hole,因为这需要太多的脑力。他们只会写混蛋,因为他们没有被过滤。@rock是的,我理解这一点,这很好,但就目前而言,过滤器肯定会改变性能完全无辜的
classic
进入
cl***ic
。它至少需要查找完整的单词。对不起,我甚至还没有找到JSON,我更关心的是实际的替换函数。@Harmen:事实上,是的。多次使用相同的属性名称只会返回为该属性分配的最后一个值。它仍然是无效的…
[]
用于数组(仅限一系列值),
{}
用于对象(一系列键和值)+1-是的,我真的没有想到JSON的带宽成本。如果使用缓存,这是一个有效的参数(很可能是),带宽将只使用一次。我已经为这个非常老的问题添加了我自己的答案。我编写了一个jQuery亵渎过滤器,在其中我将JSON传递给客户端一次,并且在可能的情况下,我将其存储在
localStorage
中。这非常有效。我必须修改
$('body')。html
而不是
$('post')).text
因为使用
.text
导致输出为纯文本而不是html。我如何使正则表达式只过滤整个单词?即:ass需要过滤,而bass不需要。我尝试在“模式”、“txt.replace”和原始JSON“filter”中添加
^
$
字符串。但它没有用。可能是因为它在寻找
正文的开头,以“swear1”开头,而在“swear1”中它显然没有。为此,您需要这样的边界:
\b…。\b
,我将更新我的答案;)查看我更新的答案和更新的示例jsFiddle,对我来说很好(:--还有一件事:您将以这种方式一次又一次地声明这些正则表达式对象,也许最好只是预编译它们并在数组中替换它们。这应该是最快的感谢您迄今为止的所有帮助,还有一个补充。我该如何使我的“fiter”实际上是外部的吗?即:外部JSON内容结果?我目前得到了路径
http://mysite.com/generic/profanity
生成正确的json,但我不确定如何获取“filter”变量来使用它。您好,我如何防止阿拉伯语脏话?是否可以使用亵渎过滤器?
var filterWords = ["fool", "dumb", "shit", "ass", "couch potato"];
var rgx = new RegExp(filterWords.join("|"), "gi");
function wordFilter(str) {           
    return str.replace(rgx, "****");            
}
$(document).profanityFilter({
    replaceWith:'#',
    customSwears: ['ass'],
    externalSwears: '/swearWords.json'
})