Javascript проверка ненормативной лексики для проверки альтернатив - PullRequest
0 голосов
/ 12 марта 2020

Можно ли проверить альтернативы конкретному c матерному слову, которое будет отлавливать такие случаи:

var badWords = ["shit", "shiit", "shiiit"];
function checkWord(word) {

}

Вместо добавления каждой возможной комбинации i, ii, iii et c в массив. Есть ли более чистый способ поймать что-то подобное? С регулярным выражением может быть

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

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

Я собираюсь использовать слова " кошка "и" собака ", чтобы не причинять слишком много обид (и рискует быть забаненным):

Массив регулярных выражений

const badWordRegexes = [
    /\bc[a4]+t\b/ig,
    /\bd[o0]+g\b/ig
];

const input = "bird snake cat fish c4t catfish birddog D00000000G";

// Use the reduce function to apply each regex in turn,
// passing along the censored input as you go
const censored = badWordRegexes.reduce(
    // For each regex, replace all matches of the regex with "*"
    (input, regex) =>
        // As each regex is applied, the input cascades,
        // rolling all edits together
        input.replace(regex,
            badWord => "*".repeat(badWord.length)
        ),
    input
);

console.log(censored);

В зависимости от длины вашего списка слов, это может быть не самый эффективный способ обработки плохих слов.

Одно регулярное выражение с чередованием

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

const badWordsRegex = new RegExp('\\b(' +
        'c[a4]+t|'+
        'd[o0]+g' +
    ')\\b', 'ig');
    
// Alternatively:
// const badWordsRegex = /\b(c[a4]+t|d[o0]+g)\b/ig;

const input = "bird snake cat fish c4t catfish birddog D00000000G";

const censored = input.replace(badWordsRegex,
    badWord => "*".repeat(badWord.length)
);

console.log(censored);

Приведенный выше код НАМНОГО короче и быстрее, но за счет того, что с ним гораздо труднее читать и работать. Вы должны выбрать между очень сложным для чтения регулярным выражением или строкой RegExp (которая встречается с другими сложностями ).

Список слов, обработанных в одно регулярное выражение

Третий вариант - автоматически сгенерировать регулярное выражение из списка слов. Преимущество этого заключается в простоте обслуживания и относительно быстрой работе (при условии, что вы генерируете регулярное выражение один раз и сохраняете его где-то вместо каждого вызова функции). Как именно вы хотите это сделать, будет зависеть от ваших потребностей, но вот один из способов:

function escapeRegExp(string) {
    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

function convertWordToRegexString(word) {
    // Start by escaping any special characters that might be in the string:
    word = escapeRegExp(word);
    // Replace all vowels with alternations of their l33t alternatives:
    const l33t = { a: "4@", e: "3", i: "1|!", o: "0" };
    return word.replace(/[aeio]/g, c => `[${c}${l33t[c]}]+`);
}

const badWords = ["cat", "dog"];
const badWordsRegexString = "\\b(" + badWords.map(convertWordToRegexString).join("|") + ")\\b";
const badWordsRegex = new RegExp(badWordsRegexString, 'ig');
    
// Alternatively:
// const badWordsRegex = /\b(c[a4]+t|d[o0]+g)\b/ig;

const input = "bird snake cat fish c4t catfish birddog D00000000G";

const censored = input.replace(badWordsRegex,
    badWord => "*".repeat(badWord.length)
);

console.log(censored);

Недостатком является то, что при таком подходе вы получаете наименьшую гибкость. Вы можете столкнуться с проблемами, если хотите фильтровать слова с помощью специальных символов или целых фраз, а не просто слов, но вы всегда можете адаптировать этот лог c в соответствии со своими потребностями.

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

0 голосов
/ 12 марта 2020

Это не тот ответ, который вы ожидаете, но есть репозиторий github , содержащий большинство слов, которые вы хотите отфильтровать. Вы можете импортировать это в свой проект и отфильтровать его с помощью простого includes или чего-то подобного.

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