Efficient. NET dirty word filtering algorithm and its application example
- 2021-08-05 09:38:01
- OfStack
In this paper, an example is given to describe the efficient. NET dirty word filtering algorithm. Share it for your reference, as follows:
Class BadWordsFilter. cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections;
using System.Data;
namespace WNF
{
public class BadWordsFilter
{
private HashSet<string> hash = new HashSet<string>(); // Keyword
private byte[] fastCheck = new byte[char.MaxValue];
private byte[] fastLength = new byte[char.MaxValue];
private BitArray charCheck = new BitArray(char.MaxValue);
private BitArray endCheck = new BitArray(char.MaxValue);
private int maxWordLength = 0;
private int minWordLength = int.MaxValue;
public BadWordsFilter()
{
}
// Initialization keyword
public void Init(DataTable badwords)
{
for (int j = 0; j < badwords.Rows.Count; j++)
{
string word = badwords.Rows[j][0].ToString();
maxWordLength = Math.Max(maxWordLength, word.Length);
minWordLength = Math.Min(minWordLength, word.Length);
for (int i = 0; i < 7 && i < word.Length; i++)
{
fastCheck[word[i]] |= (byte)(1 << i);
}
for (int i = 7; i < word.Length; i++)
{
fastCheck[word[i]] |= 0x80;
}
if (word.Length == 1)
{
charCheck[word[0]] = true;
}
else
{
fastLength[word[0]] |= (byte)(1 << (Math.Min(7, word.Length - 2)));
endCheck[word[word.Length - 1]] = true;
hash.Add(word);
}
}
}
public string Filter(string text, string mask)
{
throw new NotImplementedException();
}
// Check for keywords
public bool HasBadWord(string text)
{
int index = 0;
while (index < text.Length)
{
int count = 1;
if (index > 0 || (fastCheck[text[index]] & 1) == 0)
{
while (index < text.Length - 1 && (fastCheck[text[++index]] & 1) == 0) ;
}
char begin = text[index];
if (minWordLength == 1 && charCheck[begin])
{
return true;
}
for (int j = 1; j <= Math.Min(maxWordLength, text.Length - index - 1); j++)
{
char current = text[index + j];
if ((fastCheck[current] & 1) == 0)
{
++count;
}
if ((fastCheck[current] & (1 << Math.Min(j, 7))) == 0)
{
break;
}
if (j + 1 >= minWordLength)
{
if ((fastLength[begin] & (1 << Math.Min(j - 1, 7))) > 0 && endCheck[current])
{
string sub = text.Substring(index, j + 1);
if (hash.Contains(sub))
{
return true;
}
}
}
}
index += count;
}
return false;
}
}
}
Quote:
string sql = "select keywords from tb_keyword";
BadWordsFilter badwordfilter = new BadWordsFilter();
// Initialization keyword
badwordfilter.Init(oEtb.GetDataSet(sql).Tables[0]);
// Check whether there are keywords
bool a = badwordfilter.HasBadWord(TextBox1.Text);
if (a == true)
{
Page.RegisterClientScriptBlock("a", "<script>alert(' This comment contains illegal words! ')</script>");
}
else
{
PingLun();// Write a comment form
}
For more readers interested in asp. net, please check the topics of this site: "asp. net String Operation Skills Summary", "asp. net Operation json Skills Summary", "asp. net Operation XML Skills Summary", "asp. net File Operation Skills Summary", "asp. net ajax Skills Summary" and "asp. net Cache Operation Skills Summary".
I hope this article is helpful to everyone's asp. net programming.