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.


Related articles: