zoukankan      html  css  js  c++  java
  • im聊天敏感字屏蔽

    public string checkKey(string text)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length);
                Dictionary<object, List<string>> dicList = new Dictionary<object, List<string>>();
                HashSet<string> filterData = new HashSet<string>();
                for (int i = 2; i >= 0; i--)
                {
                    filterData.Add("微信" + (i + 9).ToString());
                    filterData.Add("wx" + (i + 9).ToString());
                    filterData.Add("qq" + (i + 9).ToString());
                }
                filterData.Add("大大");
                filterData.Add("大人物");
                foreach (var item in filterData)
                {
                    char value = item[0];
                    if (dicList.ContainsKey(value))
                        dicList[value].Add(item);
                    else
                        dicList.Add(value, new List<string>() { item });
                }
                //以上部分创建好dicList后可以直接放入到缓存,下次使用直接读取缓存即可
    
                int count = text.Length;
                for (int i = 0; i < count; i++)
                {
                    char word = text[i];
                    if (dicList.ContainsKey(word))//如果在字典表中存在这个key
                    {
                        int num = 0;//是否找到匹配的关键字 1找到0未找到
                        var data = dicList[word].OrderBy(g => g.Length);
    
                        string firstItem = data.ToList()[0];
    
                        string surplusText = text.Substring(i);
    
                        //检测每个字是否是特殊符号
                        string result = "";//要对比的结果
                        int takeNum = 0;
                        int w = 0;
                        //此处将内部的while循环提出来相同长度关键词只循环一次即可,是为了防止同样开头的关键词长度也相同,内部每一个关键词凑循环一遍
                        while (true)
                        {
                            if (IsContainSpecial(surplusText[w].ToString()))
                            {
                                takeNum += 1;
                            }
                            else
                            {
                                result += surplusText[w];
                            }
    
                            w += 1;
                            if (firstItem.Length == result.Length)
                            {
                                break;
                            }
                            if (w == surplusText.Length)
                                break;
                        }
    
                        //把该key的字典集合按 字符数排序(方便下面从少往多截取字符串查找)
                        foreach (var wordbook in data)
                        {
                            if (wordbook.Length > result.Length && w < surplusText.Length)
                            {
                                while (true)
                                {
                                    if (IsContainSpecial(surplusText[w].ToString()))
                                    {
                                        takeNum += 1;
                                    }
                                    else
                                    {
                                        result += surplusText[w];
                                    }
    
                                    if (wordbook.Length == result.Length)
                                    {
                                        break;
                                    }
                                    w += 1;
                                    if (w == surplusText.Length)
                                        break;
                                }
                            }
    
                            
                            //根据关键字长度往后截取相同的字符数进行比较
                            if (result == wordbook)
                            {
                                num = 1;
                                sb.Append(GetString(result));
                                i = i + wordbook.Length - 1 + takeNum;
                                //比较成功 同时改变i的索引
                                break;
                            }
    
                        }
                        if (num == 0)
                            sb.Append(word);
                    }
                    else
                        sb.Append(word);
                }
                return sb.ToString();
            }
            /// <summary>
            /// 替换星号
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            private static string GetString(string value)
            {
                string starNum = string.Empty;
                for (int i = 0; i < value.Length; i++)
                {
                    starNum += "*";
                }
                return starNum;
            }
            public static bool IsContainSpecial(string s)
            {
                s = s.Replace(@"", "&");
                Regex r = new Regex("[ \[ \] \^ \-_*×――(^)$%~!/@#$…&%¥—+=<>《》|!!???::•`·、。,;,.;"‘’“”-]");
                if (r.Match(s).Success)
                {
                    return true;
                }
                return false;
            }
  • 相关阅读:
    ObjectARX代码片段二
    外部程序通过COM启动AutoCAD时RPC_E_CALL_REJECTED的问题解决办法
    ObjectARX代码片段一
    Sublime Text 3 修改插件安装位置【sublime text、插件路径、Data】
    Bug的处理
    界面测试的方法要点
    并发用户数、吞吐量、思考时间的计算公式
    常用测试工具下载
    SVN安装配置详解
    Loadrunner录制脚本时选择协议
  • 原文地址:https://www.cnblogs.com/zzgxl/p/13906069.html
Copyright © 2011-2022 走看看