privateWordGroup[]_wordTable;
publicFilterResultFilter(refstringsource,charreplaceChar)
{
//NOTE::
// 如果方法返回 FilterResult.Replace或者FilterResult.Banned,则原字符串的某些字会被替代为星号,替代后的字符串可以由source取得
if(String.IsNullOrEmpty(source))returnFilterResult.Pass;
FilterResultresult=FilterResult.Pass;
char[]tempString=null;
intstart=0;
for(;start<source.Length;start++)
{
WordGroupfw=_wordTable[fastToLower(source[start])];
if(fw!=null)
{
for(intidx=0;idx<fw.Count;idx++)
{
WordEntitywe=fw.GetItem(idx);
intmatchLength=0;
if(we.Word.Length==0||checkString(source,we.Word,start+1,outmatchLength))
{
FilterResultfr=we.HandleType;
if(fr>result)result=fr;//记录最高级别的处理方法
if(fr==FilterResult.Replace||fr==FilterResult.Banned)
{
//替换关键字
if(tempString==null)tempString=source.ToCharArray();;
for(intpos=0;pos<matchLength+1;pos++)
{
tempString[pos+start]=replaceChar;
}
}
}
}
}
}
if(result>FilterResult.RecordOnly)
{
source=newstring(tempString);
}
returnresult;
}
privateboolcheckString(stringsource,stringkeyword,intsourceStart,outintmatchLength)
{
boolfound=false;
intsourceOffset=0;
intkeyIndex=0;
for(;keyIndex<keyword.Length;keyIndex++)
{
if(sourceOffset+sourceStart>=source.Length)break;//原始字符串已经全部搜索完毕
if(keyword[keyIndex]=='*')
{
//跳过可忽略的字符
while(sourceOffset+sourceStart<source.Length)
{
if(isIgnorableCharacter_CN(source[sourceOffset+sourceStart]))
sourceOffset++;
else
break;
}
}
else
{
//比较字母
if(fastToLower(source[sourceOffset+sourceStart])==(int)keyword[keyIndex])
{
if(keyIndex==keyword.Length-1)
{
found=true;
break;
}
}
else
{
break;
}
sourceOffset++;//移动原始字符串
}
}
//如果匹配中关键字,则返回原字符串中被匹配中的文字的长度,否则返回0
matchLength=sourceOffset+1;
returnfound;
}
privateintfastToLower(charcharacter)
{
//将大写英文字母以及全/半角的英文字母转化为小写字母
intcharVal=(int)character;
if(charVal<=90)
{
if(charVal>=65)//字母A-Z
returncharVal-65+97;
}
elseif(charVal>=65313)
{
if(charVal<=65338)
returncharVal-65313+97;//全角大写A-Z
elseif(charVal>=65345&&charVal<=65370)
returncharVal-65345+97;//全角小写a-z
}
returncharVal;
}
privateboolisIgnorableCharacter_CN(charcharacter)
{
//NOTE::
// 中文表意字符的范围4E00-9FA5
intcharVal=(int)character;
return!(charVal>=0x4e00&&charVal<=0x9fa5);
}
//单个过滤词条目
classWordEntity
{
publicstringWord{get;set;}
publicFilterResultHandleType{get;set;}
}
//过滤词的组
classWordGroup
{
//NOTE::用于装载一组具有同一个字开头的过滤词
privateList<WordEntity>_words;
publicWordGroup()
{
_words=newList<WordEntity>();
}
publicvoidAppendWord(stringword,FilterResulthandleType)
{
AppendWord(newWordEntity(){Word=word,HandleType=handleType});
}
publicvoidAppendWord(WordEntityword)
{
_words.Add(word);
}
publicintCount
{
get{return_words.Count;}
}
publicWordEntityGetItem(intindex)
{
return_words[index];
}
}
publicFilterResultFilter(refstringsource,charreplaceChar)
{
//NOTE::
// 如果方法返回 FilterResult.Replace或者FilterResult.Banned,则原字符串的某些字会被替代为星号,替代后的字符串可以由source取得
if(String.IsNullOrEmpty(source))returnFilterResult.Pass;
FilterResultresult=FilterResult.Pass;
char[]tempString=null;
intstart=0;
for(;start<source.Length;start++)
{
WordGroupfw=_wordTable[fastToLower(source[start])];
if(fw!=null)
{
for(intidx=0;idx<fw.Count;idx++)
{
WordEntitywe=fw.GetItem(idx);
intmatchLength=0;
if(we.Word.Length==0||checkString(source,we.Word,start+1,outmatchLength))
{
FilterResultfr=we.HandleType;
if(fr>result)result=fr;//记录最高级别的处理方法
if(fr==FilterResult.Replace||fr==FilterResult.Banned)
{
//替换关键字
if(tempString==null)tempString=source.ToCharArray();;
for(intpos=0;pos<matchLength+1;pos++)
{
tempString[pos+start]=replaceChar;
}
}
}
}
}
}
if(result>FilterResult.RecordOnly)
{
source=newstring(tempString);
}
returnresult;
}
privateboolcheckString(stringsource,stringkeyword,intsourceStart,outintmatchLength)
{
boolfound=false;
intsourceOffset=0;
intkeyIndex=0;
for(;keyIndex<keyword.Length;keyIndex++)
{
if(sourceOffset+sourceStart>=source.Length)break;//原始字符串已经全部搜索完毕
if(keyword[keyIndex]=='*')
{
//跳过可忽略的字符
while(sourceOffset+sourceStart<source.Length)
{
if(isIgnorableCharacter_CN(source[sourceOffset+sourceStart]))
sourceOffset++;
else
break;
}
}
else
{
//比较字母
if(fastToLower(source[sourceOffset+sourceStart])==(int)keyword[keyIndex])
{
if(keyIndex==keyword.Length-1)
{
found=true;
break;
}
}
else
{
break;
}
sourceOffset++;//移动原始字符串
}
}
//如果匹配中关键字,则返回原字符串中被匹配中的文字的长度,否则返回0
matchLength=sourceOffset+1;
returnfound;
}
privateintfastToLower(charcharacter)
{
//将大写英文字母以及全/半角的英文字母转化为小写字母
intcharVal=(int)character;
if(charVal<=90)
{
if(charVal>=65)//字母A-Z
returncharVal-65+97;
}
elseif(charVal>=65313)
{
if(charVal<=65338)
returncharVal-65313+97;//全角大写A-Z
elseif(charVal>=65345&&charVal<=65370)
returncharVal-65345+97;//全角小写a-z
}
returncharVal;
}
privateboolisIgnorableCharacter_CN(charcharacter)
{
//NOTE::
// 中文表意字符的范围4E00-9FA5
intcharVal=(int)character;
return!(charVal>=0x4e00&&charVal<=0x9fa5);
}
//单个过滤词条目
classWordEntity
{
publicstringWord{get;set;}
publicFilterResultHandleType{get;set;}
}
//过滤词的组
classWordGroup
{
//NOTE::用于装载一组具有同一个字开头的过滤词
privateList<WordEntity>_words;
publicWordGroup()
{
_words=newList<WordEntity>();
}
publicvoidAppendWord(stringword,FilterResulthandleType)
{
AppendWord(newWordEntity(){Word=word,HandleType=handleType});
}
publicvoidAppendWord(WordEntityword)
{
_words.Add(word);
}
publicintCount
{
get{return_words.Count;}
}
publicWordEntityGetItem(intindex)
{
return_words[index];
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货