idevapps
Locale
Почему фильтры нецензурной лексики важны для общедоступных веб-сайтов
Артур Хайбуллин
Артур Хайбуллин 08 янв 2026, 20:12

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

Проблема

Нецензурная лексика и оскорбительные высказывания в постах/комментариях создают несколько серьезных проблем:

  • Отпугивают пользователей — многие посетители уходят, если сталкиваются с оскорбительным контентом.

  • Наносят ущерб репутации бренда — ваш сайт ассоциируется с негативом.

  • Юридические риски — возможны нарушения законов о преследовании в Интернете.

  • Штрафы SEO — поисковые системы могут понизить рейтинг сайтов с несоответствующим контентом

Путь к решению

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

Как это работает

В момент сохранения данных из формы создания поста, созданный в целях цензуры сервис автоматически сканирует контент, выполняя интеллектуальное сопоставление слов текста со списком нецензурных слов как на английском, так и с русском языках. Если найдено совпадение, то происходит замена нецензурного слова по определенного в списке шаблону. Если совпадение найдено в тексте поста то он переводится в статус церновика.

public function scan(string $content): array 
{
    $words = CensorshipWord::all();
    $cleanContent = $content;
    $detectedWords = [];
    
    foreach ($words as $word) {

        $pattern = '/(?<![\p{L}\p{N}])' . preg_quote($word->word, '/') . '(?![\p{L}\p{N}])/iu';
        
        if (preg_match($pattern, $content)) {
            $cleanContent = preg_replace($pattern, $word->replacement, $cleanContent);
            $detectedWords[] = $word->word;
        }
    }
    
    return [
        'content' => $cleanContent,
        'detected_words' => $detectedWords
    ];
}

Основные реализованные функции

  1. Автоматическая проверка текста поста и перевод в статус черновика при обнаружении

// Posts with profanity are moved to draft status
PostObserver::saving(function ($post) {
    $result = $this->censorshipService->scan($post->content, 'post', $post->id, $post->user_id);
    
    if (!empty($result['detected_words'])) {
        $post->status = 'draft'; // Automatically revert to draft
        $post->title = $this->censorshipService->scan($post->title)['content'];
    }
});
  1. Защита в комментариях: комментарий не сохраняется.

// Offensive comments are prevented from being saved
CommentObserver::saving(function ($comment) {
    $result = $this->censorshipService->scan($comment->content, 'comment', $comment->id, $comment->user_id);
    
    if (!empty($result['detected_words'])) {
        throw new \Exception('Comment contains prohibited content');
    }
});
  1. Ответственность пользователя: автор такого комментария получает сообщение о недопустимых словах и может быть заблокирован.

// Users receive automatic warnings they must acknowledge
public function issueWarning(User $user, string $message, int $issuerId)
{
    UserWarning::create([
        'user_id' => $user->id,
        'issuer_id' => $issuerId,
        'message' => $message,
        'is_confirmed' => false
    ]);
}

Почему этот подход работает?

Интеллектуальное обнаружение: использует регулярные выражения с поддержкой Unicode, которые правильно обрабатывают как английский, так и русский текст, избегая ложных срабатываний с такими словами, как «басука» (которое содержит «****», но не является нецензурным).

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

Образовательный подход: пользователи должны подтвердить получение предупреждения, прежде чем продолжить, что способствует улучшению поведения.

Административный контроль: суперпользователи могут управлять словарем и просматривать журналы нарушений для контроля.

Реальное воздействие

С момента внедрения:

  • 0% оскорбительного контента попадает в открытый доступ.

  • Автоматическое применение 24/7 без ручной модерации.

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

  • Спокойствие как для администратора, так и для посетителей)

Система работает незаметно — пользователи даже не подозревают, что их контент был отфильтрован, пока не пытаются опубликовать что-то неподобающее. Это создает саморегулирующееся сообщество, в котором качественный контент естественным образом доступен каждому.

А Вы пользуетесь ли каким-либо решением по защите от нецензурной лексики в своих проектах? Буду бесконечно благодарен если поделитесь вашими мыслями и мнением относительно такой защиты в комментариях.

0
36
Комментарии (0)
Комментировать
Пока нет комментариев

Станьте первым, кто прокомментирует эту запись