2010-07-27 2 views
11

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

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

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

+6

Это, вероятно, не очень хорошая идея обновлять/вставлять цензурные строки без сохранения копии строки без цензуры. Скорее всего, вам придется адаптировать стратегию слова и замены для многих итераций до тех пор, пока она не станет «достаточно правильной» и не должна рисковать, чтобы уничтожить ваши данные за это время. –

+4

Дал вам голос, просто назвав их «Плохие слова». – Chris

ответ

18

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

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

Update

Очевидно, что нет (см. статью выше - этот подход настолько легко обойти или создать ложные срабатывания ...) или оптимизирован (регулярные выражения должны быть кэшированы и скомпилированы), но следующее будет отфильтровывать целые слова (без «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); 

Дает выход:

Я была не [Censored] сон для [Censored] [Censored] дней - сосед играет классическую музыку на скаку!

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

Update 2

И продемонстрировать вкус, как это (и в целом основной строки \ сопоставления с образцом методы) могут быть легко сорвано см следующую строку:

«I» у меня не было сна Cranberryıng для chuffıng chuffıngs days - сосед по соседству играет классическую музыку при полном наклоне! »

Я заменил «i» на турецкий чехол без знака «ı». Все еще выглядит довольно оскорбительным!

+1

Хорошая статья фона. Вероятно, это скорее комментарий, чем ответ, хотя на самом деле он не отвечает на вопрос. –

+0

@Robin Я буду гореть в аду, но я привел пример. –

+0

+1, хотя это трудная/невозможная проблема. (Я видел аркады, заполненные именем CLINT из-за используемого шрифта!) Я бы предпочел увидеть кучу ошибок в стиле S [Censored], чем детский браузер, заполненный непристойностями. –

2

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

4

Хотя я большой поклонник 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 - ваш результат.

+0

который превратит badmington в [Censored] mington –

+1

точно! : D - но серьезно, это всего лишь образец, а не решение ... Я не вижу одобрения в использовании regex, здесь. – Hinek

+0

и он превращается «плохо» в «», но не «[Censored]» – Nagg

1

Существует также хорошая статья о нем, которые могут по электронной нашел here

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

Смежные вопросы