Как лучше всего проанализировать строку на наличие «плохих» слов в C#?
Вопрос
Я думаю о чем-то вроде:
foreach (var word in paragraph.split(' ')) {
if (badWordArray.Contains(word) {
// do something about it
}
}
но я уверен, что есть лучший способ.
Заранее спасибо!
ОБНОВЛЯТЬЯ не собираюсь автоматически удалять нецензурную лексику...для моего веб-приложения я хочу получать уведомления, если используется слово, которое я считаю «плохим».Затем я проверю его сам, чтобы убедиться, что он законен.Своего рода система автоматической пометки.
Решение
Хотя ваш способ работает, он может занять немного времени.Eсть замечательный ответ здесь для предыдущего вопроса SO.Хотя в вопросе говорится о PHP, а не о C#, я думаю, что его можно легко портировать.
Измените, чтобы добавить пример кода:
public string FilterWords(string inputWords) {
Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
return wordFilter.Replace(inputWords, "<3");
}
Это должно сработать для вас, более или менее.
Отредактируйте, чтобы ответить на разъяснения ОП:
Я не собираюсь автоматически удалять нецензурную лексику...для моего веб-приложения я хочу получать уведомления, если используется слово, которое я считаю «плохим».
Как и в случае с заменой выше, вы можете увидеть, соответствует ли что-то, например:
public bool HasBadWords(string inputWords) {
Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
return wordFilter.IsMatch(inputWords);
}
Оно вернется true
если строка, которую вы ей передали, содержит какие-либо слова из списка.
Другие советы
На моей работе мы поместим несколько автоматических плохих слов, фильтрацию в наше программное обеспечение (это вроде шокирующего, чтобы просматривать источник и внезапно проходить через массив, содержащий несколько страниц непристойности).
Один совет предназначен для предварительной обработки пользовательского ввода перед тестированием против вашего списка, в этом случае кто-то пытается что-то пролить вас.Итак, путем предварительной обработки, мы
- .
- прописные Все на входе
- Удалить большинство неисточника (то есть просто сращивание любых пробелов или пунктуацию и т. Д.)
- , а затем, если предположить, что кто-то пытается снять цифры для букв, сделайте что-то вроде этого: заменить ноль с O, 9 с G, 5 с S и т. Д. (Получить креатив)
, а затем заставь некоторых друзей, чтобы попытаться сломать его.Это весело.
Вы могли бы рассмотреть возможность использования HashKey
объекты или Dictionary<T1, T2
> вместо массива, например, использование словаря может сделать код более эффективным, потому что метод .Contains() становится методом .Keys .Contains(), что намного эффективнее.Это особенно верно, если у вас большой список ненормативной лексики (не уверен, сколько их всего!:)