关键字过滤(转载)

简介:

 最近写了一个关键字过滤器,也就是脏字过滤,由于是新手,所以效率大家可能不敢恭维。

不过总算是实现了哈。

   对于保存脏字的字典,用的是NameValueCollection,他的结构大概为下图:

   

 

 

 

     一个键值组合,

一个键能对应多个值,

这就使得我们第一次

的匹配能减少很多次。




 

 

 

 

      按照这个结构,我们把关键字的字典读取,每次增加关键字都会历遍Key组,如果相对应的Key已经存在,

则把值添加到对应Key的值组里面,如果不存在则创建新的Key来存放值。

 

      下面是我的流程图:

 

 

      然后是测试的效率:

     

     

 

      最后是实现的代码,需要的兄弟可以用用,但不保证效率哈~

 


 

复制代码
  1using  System;
  2using
 System.Collections.Specialized;
  3using
 System.Xml;
  4using
 System.Text;
  5using
 System.IO;
  6

  7namespace
 KeyWordFilter
  8
{
  9

 10    
/// <summary>
 11    /// 脏字过滤
 12    ///
 脏字字典需命名后放在根目录下。
 13    /// </summary>

 14    public class KeyWordFilter
 15    
{
 16        //保存脏字的字典

 17        private NameValueCollection KeyWordDictionary = new NameValueCollection();
 18

 19        public
 KeyWordFilter()
 20        
{
 21            //初始化脏字字典

 22            GetAllTheKeyWord();
 23        }

 24
 25

 26

 27        private void
 GetAllTheKeyWord()
 28        
{
 29            String KeyWord = ""
;
 30

 31            XmlDocument xmlDocument = new
 XmlDocument();
 32

 33            //配置信息,保存脏字字典的位置及名称

 34            xmlDocument.Load("Config.xml");
 35            XmlNode node =
 xmlDocument.DocumentElement;
 36

 37            //脏字字典地址

 38            string File_Name = node.SelectNodes("KeyWordDictionary").Item(0).InnerText.ToString();
 39

 40            //
string File_Name = @".\Dictionary.txt";
 41

 42            //文件存在则开始读取

 43            if (File.Exists(File_Name))
 44            
{
 45                //读取脏字符

 46                StreamReader reader = new StreamReader(File_Name, System.Text.Encoding.GetEncoding("gb2312"));
 47                String input = ""
;
 48                while (reader.Peek() > 1
)
 49                
{
 50                    input =
 (reader.ReadLine());
 51

 52                    //将脏字首字作为键,后续的字符串作为值

 53                    KeyWordDictionary.Add(input[0].ToString(), input.ToString().Substring(1, input.Length - 1));
 54                    input = string
.Empty;
 55                }

 56            }

 57        }

 58
 59        public
 String CheckTheText(String input)
 60        
{
 61            //保存新字符的StringBuilder

 62            StringBuilder newString = new StringBuilder();
 63            int i = 0
;
 64

 65            //
如果脏字字典不为空,则
 66            //历遍input,检查是否有非法字

 67            if (KeyWordDictionary.Keys.Count != 0)
 68            
{
 69                for (i = 0; i <
 input.Length; )
 70                
{
 71

 72                    foreach (string key in
 KeyWordDictionary.AllKeys)
 73                    
{
 74                        if (i <
 input.Length)
 75                        
{
 76                            //input的当前字符是否在脏字字典的键组中

 77                            if (input[i].ToString() == key)
 78                            
{
 79                                //历遍当前键所在的脏字值组

 80                                foreach (string word in KeyWordDictionary.GetValues(key))
 81                                
{
 82

 83                                    if ((i + word.Length) <
 input.Length)
 84                                    
{
 85                                        //
从当前位置开始,截取与当前值相同长度的字符串与
 86                                        //当前脏字比较

 87                                        if (input.Substring(i + 1, word.Length) == word)
 88                                        
{
 89                                            //如果符合则替换与脏字相同长度的字符

 90                                            newString.Append(ChangeTheWords(input[i], word.Length));
 91                                            i += word.Length + 1
;
 92                                            break
;
 93                                        }

 94                                        else
 95                                        {
 96                                            //如果匹配到最后一个仍未有脏字,则把当前字符加入输出字符串

 97                                            if (word == KeyWordDictionary.GetValues(key)[KeyWordDictionary.GetValues(key).Length - 1])
 98                                            
{
 99
                                                newString.Append(input[i]);
100                                                i++
;
101                                            }

102                                        }

103                                    }

104                                    else { } //如果下个需要匹配的脏字超过了剩下了字符长度,则跳过当前脏字符.
105
106                                }

107                            }

108                            //如果没有键与当前字符匹配,则把当前字符加入输出字符串
109                            else if (key == KeyWordDictionary.AllKeys[KeyWordDictionary.Keys.Count - 1])
110                            
{
111
                                newString.Append(input[i]);
112                                i++
;
113                            }

114                        }

115                        //catch (Exception e) { }
116
117                    }

118                }

119            }

120            else newString.Append(input);  //如果脏字字典为空,则返回原文
121
122            return newString.ToString();
123        }

124
125        //根据传入的长度生成屏蔽符号

126        private string ChangeTheWords(char input, int length)
127        
{
128            StringBuilder newString = new
 StringBuilder();
129

130
            newString.Append(input);
131

132            for (int i = 0; i < length; i++
)
133            
{
134                newString.Append("*"
);
135            }

136            return newString.ToString();
137        }

138    }

139}

140
复制代码

 

http://www.cnblogs.com/SinSay/archive/2009/03/28/1424003.html

版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

分类: 框架学习
0
0
« 上一篇: AE按行政区范围加载图层数据(转载)
» 下一篇: ArcGIS Engine开发系列:将地图导出为图片的两种方法
posted @ 2009-03-28 21:52 温景良(Jason) Views( 409) Comments( 0) Edit 收藏
 
目录
打赏
0
0
0
0
9
分享
相关文章
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
73 1
10 个 C# 关键字和功能
10 个 C# 关键字和功能
81 8
|
10月前
|
条件操作符
条件操作符(三目操作符)是C语言中的唯一一个三元运算符,形式为:`表达式1 ? 表达式2 : 表达式3`。如果`表达式1`为真,执行`表达式2`并返回结果;否则执行`表达式3`并返回结果。例子展示了如何用条件操作符输出两个数中的较大值。
47 1
|
10月前
有关筛选条件的问题
有关筛选条件的问题
50 0
网站关键字匹配度不高怎么办?
恰当的关键字能为网站带来流量,关键字也能得到良好的排名,从而为企业带来更多的客户,因此关键字的选择对网站来说非常重要。那怎样选择关键字呢?选择流量稳定的关键字。
109 0
网站关键字匹配度不高怎么办?
艾伟:一个简单的关键字过滤算法
早上看到老赵的《一个较完整的关键字过滤解决方案(上)》文章,讲到怎样在项目中嵌入过滤方案的问题,以及提到 xingd 和 sumtec 两位大师发表的系列互拼的文章,在此我也忍不住谈谈自己遇到的问题以及一个的简化版的算法。
1028 3
艾伟:一个较完整的关键字过滤解决方案(上)
  如果您希望看到关键字过滤算法的话那么可能就要失望了。博客园中已经有不少关于此类算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考使用。而本文的目的,是给出一个较为完整的关键字过滤功能,也就是将用户输入中的敏感字符进行替换——这两者有什么区别?那么就请继续看下去吧。
1120 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等