From 630a415aff06ce0f2fb32bb776ee11954e17639f Mon Sep 17 00:00:00 2001 From: Professional Date: Sun, 25 May 2025 22:47:56 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/utils/profanityFilter.js | 46 +++++++++++++++++++------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/backend/utils/profanityFilter.js b/backend/utils/profanityFilter.js index 674df45..e50b7ba 100644 --- a/backend/utils/profanityFilter.js +++ b/backend/utils/profanityFilter.js @@ -1,5 +1,4 @@ // Утилита для фильтрации нежелательного контента -const Filter = require('bad-words'); const fs = require('fs'); const path = require('path'); @@ -40,28 +39,22 @@ function loadBadWordsFromFile(filePath) { class ProfanityFilter { constructor() { - // Создаем экземпляр фильтра с английскими словами по умолчанию - this.filter = new Filter({ placeHolder: '*' }); - // Загружаем слова из файлов const russianFileWords = loadBadWordsFromFile(path.join(__dirname, 'words.txt')); const englishFileWords = loadBadWordsFromFile(path.join(__dirname, 'en.txt')); // Объединяем все источники запрещенных слов - const allBadWords = [ + this.badWords = [ ...russianBadWords, ...datingAppBadWords, ...russianFileWords, ...englishFileWords ]; - - // Добавляем все слова в фильтр - this.filter.addWords(...allBadWords); // Создаем регулярные выражения для проверки производных слов - this.generateWordPatterns(allBadWords); + this.generateWordPatterns(this.badWords); - console.log(`Всего загружено ${allBadWords.length} запрещенных слов`); + console.log(`Всего загружено ${this.badWords.length} запрещенных слов`); } /** @@ -106,9 +99,11 @@ class ProfanityFilter { const normalizedText = text.toLowerCase() .replace(/[\s\._\-]+/g, ''); // Удаляем пробелы, точки, подчеркивания, дефисы - // Проверяем сначала стандартным методом библиотеки bad-words - if (this.filter.isProfane(normalizedText) || this.filter.isProfane(text.toLowerCase())) { - return true; + // Проверяем на простое вхождение запрещенных слов + for (const word of this.badWords) { + if (normalizedText.includes(word.toLowerCase())) { + return true; + } } // Дополнительная проверка на производные слова через регулярные выражения @@ -138,8 +133,13 @@ class ProfanityFilter { clean(text) { if (!text) return ''; - // Сначала используем стандартный метод библиотеки - let cleanedText = this.filter.clean(text); + let cleanedText = text; + + // Проверяем и заменяем на звездочки каждое запрещенное слово + this.badWords.forEach(word => { + const regex = new RegExp(`\\b${word}\\b`, 'gi'); + cleanedText = cleanedText.replace(regex, match => '*'.repeat(match.length)); + }); // Затем проверяем на производные слова и заменяем их this.wordPatterns.forEach(pattern => { @@ -154,17 +154,25 @@ class ProfanityFilter { * @param {string|Array} words - Слово или массив слов для добавления */ addWords(words) { - // Добавляем слова в стандартный фильтр - this.filter.addWords(words); - - // Если слова переданы как массив + // Добавляем слова в список запрещенных слов if (Array.isArray(words)) { + this.badWords.push(...words); this.generateWordPatterns(words); } else { // Если передано одно слово + this.badWords.push(words); this.generateWordPatterns([words]); } } + + /** + * Проверяет является ли слово запрещенным + * @param {string} word - Слово для проверки + * @return {boolean} - true, если слово запрещено, иначе false + */ + isProfane(word) { + return this.hasProfanity(word); + } } // Экспортируем экземпляр фильтра для использования в приложении