Пока вы просто пытаетесь раскрыть очевидные случаи и не пытаетесь создать пуленепробиваемую систему, регулярное выражение может быть очень полезным здесь.
Я собираюсь использовать слова " кошка "и" собака ", чтобы не причинять слишком много обид (и рискует быть забаненным):
Массив регулярных выражений
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 в соответствии со своими потребностями.
В конечном итоге это будет баланс между время вашего модератора, требования к производительности и время разработчика. Но опять же большинство программных проектов.