高效.NET脏字过滤算法与应用实例
本文实例讲述了高效.NET脏字过滤算法。分享给大家供大家参考,具体如下:
BadWordsFilter.cs类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Collections;
usingSystem.Data;
namespaceWNF
{
publicclassBadWordsFilter
{
privateHashSet<string>hash=newHashSet<string>();//关键字
privatebyte[]fastCheck=newbyte[char.MaxValue];
privatebyte[]fastLength=newbyte[char.MaxValue];
privateBitArraycharCheck=newBitArray(char.MaxValue);
privateBitArrayendCheck=newBitArray(char.MaxValue);
privateintmaxWordLength=0;
privateintminWordLength=int.MaxValue;
publicBadWordsFilter()
{
}
//初始化关键字
publicvoidInit(DataTablebadwords)
{
for(intj=0;j<badwords.Rows.Count;j++)
{
stringword=badwords.Rows[j][0].ToString();
maxWordLength=Math.Max(maxWordLength,word.Length);
minWordLength=Math.Min(minWordLength,word.Length);
for(inti=0;i<7&&i<word.Length;i++)
{
fastCheck[word[i]]|=(byte)(1<<i);
}
for(inti=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);
}
}
}
publicstringFilter(stringtext,stringmask)
{
thrownewNotImplementedException();
}
//检查是否有关键字
publicboolHasBadWord(stringtext)
{
intindex=0;
while(index<text.Length)
{
intcount=1;
if(index>0||(fastCheck[text[index]]&1)==0)
{
while(index<text.Length-1&&(fastCheck[text[++index]]&1)==0);
}
charbegin=text[index];
if(minWordLength==1&&charCheck[begin])
{
returntrue;
}
for(intj=1;j<=Math.Min(maxWordLength,text.Length-index-1);j++)
{
charcurrent=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])
{
stringsub=text.Substring(index,j+1);
if(hash.Contains(sub))
{
returntrue;
}
}
}
}
index+=count;
}
returnfalse;
}
}
}
引用:
stringsql="selectkeywordsfromtb_keyword";
BadWordsFilterbadwordfilter=newBadWordsFilter();
//初始化关键字
badwordfilter.Init(oEtb.GetDataSet(sql).Tables[0]);
//检查是否有存在关键字
boola=badwordfilter.HasBadWord(TextBox1.Text);
if(a==true)
{
Page.RegisterClientScriptBlock("a","<script>alert('该评论含有不合法文字!')</script>");
}
else
{
PingLun();//写入评论表
}
更多关于asp.net相关内容感兴趣的读者可查看本站专题:《asp.net字符串操作技巧汇总》、《asp.net操作json技巧总结》、《asp.net操作XML技巧总结》、《asp.net文件操作技巧汇总》、《asp.netajax技巧总结专题》及《asp.net缓存操作技巧总结》。
希望本文所述对大家asp.net程序设计有所帮助。