在 C# 中解析字符串中“坏”单词的最佳方法是什么?
题
我在想这样的事情:
foreach (var word in paragraph.split(' ')) {
if (badWordArray.Contains(word) {
// do something about it
}
}
但我确信有更好的方法。
提前致谢!
更新我不想自动删除淫秽内容......对于我的网络应用程序,如果使用了我认为“不好”的单词,我希望收到通知。然后我会亲自审查以确保其合法性。某种自动标记系统。
解决方案
虽然你的方法有效,但可能会有点耗时。有一个 这里的反应很好 对于之前的SO问题。虽然问题讨论的是 PHP 而不是 C#,但我认为它可以很容易移植。
编辑添加示例代码:
public string FilterWords(string inputWords) {
Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
return wordFilter.Replace(inputWords, "<3");
}
这或多或少应该对你有用。
编辑回答OP澄清:
我不想自动删除淫秽内容......对于我的网络应用程序,如果使用了我认为“不好”的单词,我希望收到通知。
与上面的替换部分非常相似,您可以查看是否有匹配的内容,如下所示:
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() ,效率更高。如果您有大量脏话(不确定有多少!),则尤其如此!:)
不隶属于 StackOverflow