我知道有很多争论为什么这是一个坏主意,但在我的实现中,我计划在帐户设置中启用/禁用坏词。换句话说,默认情况下会显示坏词,但如果被问到则会关闭/隐藏。
计划是将JSON字符串发送到客户端,让客户端过滤掉坏字。
json string
['swear1', 'swear2']
原始短语
this phrase includes swear1
最终输出
this phrase includes ****
这是我到目前为止所尝试的
$(document).ready (function () {
$('body').html().replace('asdf', 'ffff');
});
现在请注意,我正在使用asp.net mvc而我“可以”在服务器端执行此操作,但我认为如果卸载到客户端会更好......我愿意对此的建议。
答案 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插件。这似乎是我可能想出的最佳实现。
$(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
}
}