Как я могу сделать JQuery фильтр ругательства / плохое слово? - PullRequest
8 голосов
/ 27 декабря 2010

Я знаю, что есть много аргументов относительно того, почему это плохая идея, но в моей реализации я планирую включить / отключить плохие слова в настройках учетной записи. Другими словами, плохие слова будут видны по умолчанию, но будут отключены / скрыты, если их попросят.

Планируется отправить клиенту строку JSON и позволить клиенту отфильтровывать плохие слова.

строка json

['swear1', 'swear2']

оригинальная фраза

this phrase includes swear1

конечный результат

this phrase includes ****

это то, что я пробовал до сих пор

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

Теперь на заметку, я использую asp.net mvc, и я "мог" сделать это на стороне сервера, но я думал, что это было бы лучше, если бы выгружался на клиент ... Я открыт для предложения по этому вопросу.

Ответы [ 6 ]

12 голосов
/ 27 декабря 2010

Примерно так может работать:

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

Редактировать : добавлены границыпоэтому он не заменит слова, содержащие нецензурные слова.Я использовал двойные обратные косые черты, потому что обратные косые черты следует экранировать в строке, см. Эту тему .

4 голосов
/ 25 апреля 2011

Вот легкая функция.

var filterWords = ["fool", "dumb", "shit", "ass", "couch potato"];
var rgx = new RegExp(filterWords.join("|"), "gi");
function wordFilter(str) {           
    return str.replace(rgx, "****");            
}
3 голосов
/ 14 февраля 2012

Итак, я принял базовое предложение, которое дал @Harmen, и расширил его до плагина jQuery.Кажется, это лучшая реализация, которую я мог бы придумать.

jQuery.profanityFilter

$(document).profanityFilter({
    replaceWith:'#',
    customSwears: ['ass'],
    externalSwears: '/swearWords.json'
})
1 голос
/ 27 декабря 2010

При перемещении вещей с сервера на клиент вы всегда должны учитывать пропускную способность в сравнении со стоимостью обработки. Несомненно, наличие этого на стороне клиента сведет к минимуму затраты на обработку, но вы потратите много времени на перенос списка плохих слов клиенту.

Кроме того, наличие этого на сервере может, например, позволять вам предварительно обрабатывать сообщения и обновлять его только при изменении правила, экономя еще больше времени на обработку.

0 голосов
/ 27 декабря 2010

Вы захотите перебрать все слова: для каждого слова проверьте, является ли оно одним из ваших запрещенных слов, прежде чем заменять его звездочками.

Чтобы сделать это эффективно, вам нужносохраните слова в хеш-таблице:

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

Переберите каждое слово и посмотрите, есть ли оно в хеш-таблице.(Интерпретация того, что включает в себя «слово», варьируется в зависимости от того, ищите ли вы символы, окруженные пробелами или другими не-буквенными символами.)

// Pseudocode
for each word in content {
    if (badWords[word]) {
        // replace word with word.length * characters
    }
}
0 голосов
/ 27 декабря 2010

Возвращаемый объект JSON не может иметь повторяющихся имен атрибутов.Вместо { w: 'Swear1', w: 'Swear2' } это должно быть [ 'Swear1', 'Swear2' ].

. Вы можете анализировать текст для фильтрации и переноса каждого вхождения матерного слова между тегами <span> с определенным атрибутом класса и переключать их с помощью функции.Это должен быть простой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...