我想知道如何在文本更改事件中自动从错误的单词中过滤richtextbox
。我正在开发一个本地聊天软件,使用ip来创建计算机之间的连接,但我需要过滤它,例如
Richtextbox.text = "oh s***";
Richtextbox
会弹出一个消息框,提醒用户并禁用输入5秒钟,然后再次启用它。
答案 0 :(得分:2)
有趣的问题!我想,就像那样:
using System.Text.RegularExpressions;
...
HashSet<String> badWords = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
"bad",
"words",
};
Boolean result = YourRichTextBox
.Lines
.Any(line => Regex
.Split(line, @"\W")
.Any(word => badWords.Contains(word)));
请注意,坏词可以从重写字母,大写字母等开始。另一个困难是我们必须检测"BAD!"
,但不是,"baddy"
。
要提醒,用户只需将代码放入TextChanged
事件处理中:
private void YourRichTextBox_TextChanged(object sender, EventArgs e) {
RichTextBox YourRichTextBox = sender as RichTextBox;
Boolean result = ... // See code above
if (result) {
MessageBox.Show("You must not be that rude!", Text, MessageBoxButtons.OK);
...
}
}
答案 1 :(得分:1)
我认为这个问题有点宽泛,但您可以使用Linq来做到这一点:
List<string> badWords = new List<string> { "bad", "words", "here" };
string myString = "This string contains a bad word";
bool badWordInString = badWords.Any(myString.Contains);
如果badWordInString
包含列表中的任何错误字词,则 true
将为myString
。
然后,您可以使用文本替换来替换被删除的替换词。
问题在于,以这种方式进行审查是因为它没有考虑 baddy 这个词中的 bad 这样的词。您可能希望允许 baddy ,但不能 bad ,但由于这是在文本更改事件处理程序中发生的,因此您永远无法输入 baddy
更好的解决方案是在发送之后检查文本,寻找单词边界,修剪标点符号,忽略大小写并检查整个单词是否匹配。
答案 2 :(得分:1)
答案 3 :(得分:1)
我必须将这个实现到我的项目中,以为我会分享我的代码。我创建了一个文本文件并将其存储在网站中,因此无需重新编译或更改web.config设置即可轻松修改。
这样做的好方法是在提交按钮时执行此操作,因为您使用的是RTE。我会说在提交按钮之前使用ajax检查它是否包含“坏词”,这样你就不必做回发了,但看起来你正在使用Win Forms,这就是MVC。但你可以得到图片。
我在本网站https://github.com/shutterstock/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words
中使用了英语和西班牙语中的“坏词”文本文件放在/ Content文件夹中(在我的情况下)
如果您可以使用(或者如果有其他人想要的话),这里是ajax
$('#form-ID').on('click', 'button[type="submit"]', function (e) {
var badWords = '',
str = $('#form-ID').find('textarea').val();
$.ajax({
url: '/YourAPI/CheckForBadWords?str=' + str,
type: 'POST',
dataType: 'json',
data: '',
async: false,
contentType: 'application/json; charset=utf-8',
complete: function (data) {
badWords = data.responseText;
}
});
if (badWords != '') {
console.log('oh no --- ' + badWords)
e.preventDefault();
return false;
}
});
Api方法 - 您也可以将其放入Button提交事件
[HttpPost] // <--- remove if not using Api
public string CheckForBadWords(string str)
{
string badWords = string.Empty;
var badWordsResult = Global.CheckForBadWords(str);
if (badWordsResult.Length > 0)
{
badWords = string.Join(", ", badWordsResult);
}
return badWords;
}
Global.cs文件
public static class Global
{
/// <summary>
/// Returns a list of bad words found in the string based
/// on spanish and english "bad words"
/// </summary>
/// <param name="str">the string to check</param>
/// <returns>list of bad words found in string (if any)</returns>
public static string[] CheckForBadWords(string str)
{
var badWords = GetBadWords();
var badWordsCaught = new List<string>();
if (badWords.Any(str.ToLower().Contains))
{
badWordsCaught = badWords.Where(x => str.Contains(x)).ToList();
}
return badWordsCaught.ToArray();
}
/// <summary>
/// Retrieves a list of "bad words" from the text file. Words include
/// both spanish and english
/// </summary>
/// <returns>strings of bad words</returns>
private static List<string> GetBadWords()
{
var badWords = new List<string>();
string fileName = string.Format("{0}/Content/InvalidWords.txt", AppDomain.CurrentDomain.BaseDirectory);
if (System.IO.File.Exists(fileName))
{
badWords = System.IO.File.ReadAllLines(fileName).ToList();
}
return badWords.ConvertAll(x => x.ToLower());
}
}
修改强>
必须从URL字符限制的api调用b / c中删除查询字符串参数。相反,我只是传递JSON字符串
var badWords = '',
str = stringHERE;
$.ajax({
url: '/YourApiController/CheckForBadWords',
type: 'POST',
dataType: 'json',
data: JSON.stringify({ str: str }),
async: false,
contentType: 'application/json; charset=utf-8',
complete: function (data) {
badWords = data.responseText;
}
});