我在想这样的事情:

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() ,效率更高。如果您有大量脏话(不确定有多少!),则尤其如此!:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top