Замените плохие слова с помощью регулярных выражений - PullRequest
11 голосов
/ 27 июля 2010

Я пытаюсь создать метод фильтра плохих слов, который я могу вызывать перед каждой вставкой и обновлять, чтобы проверить строку на наличие плохих слов и заменить на «[Censored]».

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

Я использую C # для этого.

Ответы [ 4 ]

18 голосов
/ 27 июля 2010

Пожалуйста, ознакомьтесь с этой статьей "clbuttic" (или для вашего случая cl [Censored] ic) перед выполнением замены строки без учета границ слова:

http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

Обновление

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

const string CensoredText = "[Censored]";
const string PatternTemplate = @"\b({0})(s?)\b";
const RegexOptions Options = RegexOptions.IgnoreCase;

string[] badWords = new[] { "cranberrying", "chuffing", "ass" };

IEnumerable<Regex> badWordMatchers = badWords.
    Select(x => new Regex(string.Format(PatternTemplate, x), Options));

string input = "I've had no cranberrying sleep for chuffing chuffings days -
    the next door neighbour is playing classical music at full tilt!";

string output = badWordMatchers.
   Aggregate(input, (current, matcher) => matcher.Replace(current, CensoredText));

Console.WriteLine(output);

Дает вывод:

У меня не было [цензурированного] сна в течение [цензурированных] [цензурированных] дней - сосед по соседству играет классическую музыку на полном ходу!

Обратите внимание, что «классический» не становится «cl [Censored] ical», поскольку целые слова сопоставляются с регулярным выражением.

Обновление 2

И чтобы продемонстрировать, как это (и в целом основные методы сопоставления строк и шаблонов) можно легко подорвать, см. Следующую строку:

«У меня не было клюквенного сна в течение нескольких дней - сосед по соседству играет классическую музыку на полном ходу!»

Я заменил "i" на турецкие строчные буквы "ı". По-прежнему выглядит довольно обидно!

4 голосов
/ 27 июля 2010

Хотя я большой поклонник Regex, я думаю, что это вам здесь не поможет. Вы должны извлечь свое плохое слово в строку List или string Array и использовать System.String.Replace в своем входящем сообщении.

Может быть, лучше использовать System.String.Split и .Join методы:

string mayContainBadWords = "... bla bla ...";
string[] badWords = new string[]{"bad", "worse", "worst"};

string[] temp = string.Split(badWords, StringSplitOptions.RemoveEmptyEntries);
string cleanString = string.Join("[Censored]", temp);

В примере mayContainBadWords - строка, которую вы хотите проверить; badWords - это строковый массив, который вы загружаете из таблицы плохих слов sql, а cleanString - ваш результат.

2 голосов
/ 27 июля 2010

вы можете использовать метод string.replace () или класс RegEx

1 голос
/ 27 июля 2010

Есть также хорошая статья об этом, которую можно найти здесь

С небольшими навыками разбора html, вы можете получить большой список с нецензурными словами из noswear

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