8

我在想类似的东西:

foreach (var word in paragraph.split(' ')) {
  if (badWordArray.Contains(word) {
    // do something about it
  }
}

但我确信有更好的方法。

提前致谢!

更新 我不希望自动删除淫秽内容......对于我的网络应用程序,如果使用了我认为“坏”的词,我希望得到通知。然后我会自己审查它以确保它是合法的。各种自动标记系统。

4

3 回答 3

16

虽然您的方式有效,但可能会有点耗时。对于之前的 SO question,这里有一个很好的回应。虽然这个问题是关于 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如果您传递给它的字符串包含列表中的任何单词,它将返回。

于 2010-07-09T03:25:57.623 回答
4

在我的工作中,我们在我们的软件中加入了一些自动的坏词过滤(浏览源代码并突然遇到包含几页淫秽内容的数组,这有点令人震惊)。

一个提示是在针对您的列表进行测试之前预处理用户输入,在这种情况下,有人试图从您那里偷偷摸摸。所以通过预处理,我们

  • 大写输入中的所有内容
  • 删除大多数非字母数字(即,只需拼接出任何空格或标点符号等)
  • 然后假设有人试图为字母传递数字,请执行以下操作:将零替换为 O,将 9 替换为 G,将 5 替换为 S,等等(发挥创意)

然后让一些朋友尝试打破它。很有趣。

于 2010-07-09T05:03:29.043 回答
2

您可以考虑使用HashKey对象或Dictionary<T1, T2> 而不是数组,例如使用 Dictionary 可以使代码更高效,因为 .Contains() 方法变为 .Keys.Contains() 更有效。如果您有大量脏话(不确定有多少!:),则尤其如此

于 2010-07-09T03:30:34.540 回答