Как на JS реализовать фильтр нецензурных слов в чате в реальном времени?

Реализация фильтра нецензурных слов в чате на JavaScript в реальном времени — задача, которая решается на нескольких уровнях: клиентском и серверном. Ниже разберём полный подход.

## 1. Базовый список запрещённых слов

Создайте массив слов, которые нужно фильтровать:

js
const badWords = [‘слово1’, ‘слово2’, ‘слово3’];

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

## 2. Функция замены нецензурных слов

js
function filterMessage(text) {
let filtered = text;
badWords.forEach(word => {
const regex = new RegExp(word, ‘gi’);
filtered = filtered.replace(regex, ‘*’.repeat(word.length));
});
return filtered;
}

Флаг `gi` обеспечивает регистронезависимый поиск и замену всех вхождений.

## 3. Обработка ввода в реальном времени

Подключите фильтр к событию `input` текстового поля:

js
const input = document.getElementById(‘chat-input’);

input.addEventListener(‘input’, () => {
const cursorPos = input.selectionStart;
input.value = filterMessage(input.value);
input.setSelectionRange(cursorPos, cursorPos);
});

Сохранение позиции курсора важно для удобства пользователя.

## 4. Фильтрация при отправке сообщения

js
form.addEventListener(‘submit’, (e) => {
e.preventDefault();
const cleanMessage = filterMessage(input.value.trim());
sendToChat(cleanMessage);
input.value = »;
});

## 5. Защита от обходов фильтра

Пользователи часто пытаются обойти фильтр, вставляя пробелы, цифры или спецсимволы. Добавьте нормализацию текста перед проверкой:

js
function normalize(text) {
return text
.replace(/[s-.,_]/g, »)
.replace(/0/g, ‘о’)
.replace(/3/g, ‘е’)
.toLowerCase();
}

function containsBadWord(text) {
const normalized = normalize(text);
return badWords.some(word => normalized.includes(normalize(word)));
}

## 6. Серверная валидация (Node.js)

Клиентский фильтр — лишь первый рубеж. Всегда дублируйте проверку на сервере:

js
// Node.js + Express
app.post(‘/send-message’, (req, res) => {
const { message } = req.body;
if (containsBadWord(message)) {
return res.status(400).json({ error: ‘Сообщение содержит недопустимые слова’ });
}
// сохраняем и рассылаем сообщение
});

## 7. Готовые библиотеки

Для продакшн-решений рассмотрите готовые npm-пакеты:
— **bad-words** — популярная библиотека с поддержкой кастомных списков
— **leo-profanity** — гибкая настройка и поддержка нескольких языков

js
const Filter = require(‘bad-words’);
const filter = new Filter();
console.log(filter.clean(‘текст с плохим словом’));

## Итог

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


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.