using System; 
 | 
    using System.Collections.Generic; 
 | 
    using System.Text.RegularExpressions; 
 | 
    using UnityEngine; 
 | 
    using System.Threading; 
 | 
  
 | 
    public partial class DirtyWordConfig : ConfigBase<int, DirtyWordConfig> 
 | 
    { 
 | 
  
 | 
        private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue]; 
 | 
  
 | 
        private static List<string> memoryList = new List<string>(); 
 | 
  
 | 
        private static bool dirtyWordInited = false; 
 | 
  
 | 
        static int cursor = 0; 
 | 
  
 | 
        static int wordlenght = 0; 
 | 
  
 | 
        static int nextCursor = 0; 
 | 
  
 | 
        protected override void OnConfigParseCompleted() 
 | 
        { 
 | 
            base.OnConfigParseCompleted(); 
 | 
            if (string.IsNullOrEmpty(word)) 
 | 
            { 
 | 
                Debug.LogErrorFormat("屏蔽字 id = {0} 的内容为空 需要修改", id); 
 | 
                return; 
 | 
            } 
 | 
            var tmpword = word.Replace(" ", ""); 
 | 
            string key = ToDBC(tmpword); 
 | 
            memoryList.Add(key); 
 | 
        } 
 | 
  
 | 
        private static string ToDBC(string input) 
 | 
        { 
 | 
            char[] c = input.ToCharArray(); 
 | 
            for (int i = 0; i < c.Length; i++) 
 | 
            { 
 | 
                if (c[i] == 12288) 
 | 
                { 
 | 
                    c[i] = (char)32; 
 | 
                    continue; 
 | 
                } 
 | 
                if (c[i] > 65280 && c[i] < 65375) 
 | 
                    c[i] = (char)(c[i] - 65248); 
 | 
            } 
 | 
            return new string(c).ToLower(); 
 | 
        } 
 | 
  
 | 
        public static string IsDirtWord(string source, char filter) 
 | 
        { 
 | 
            if (source != string.Empty) 
 | 
            { 
 | 
                cursor = 0; 
 | 
                nextCursor = 0; 
 | 
                char[] temp = source.ToCharArray(); 
 | 
                source = FitterSpecial(source); 
 | 
                for (int i = 0; i < source.Length; i++) 
 | 
                { 
 | 
                    //查询以该字为首字符的词组 
 | 
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]]; 
 | 
                    if (group != null) 
 | 
                    { 
 | 
                        for (int z = 0; z < group.Count(); z++) 
 | 
                        { 
 | 
                            string word = group.GetWord(z); 
 | 
                            if (word.Length == 0 || Check(word, source)) 
 | 
                            { 
 | 
                                string blackword = string.Empty; 
 | 
                                for (int pos = 0; pos < wordlenght + 1; pos++) 
 | 
                                { 
 | 
                                    try 
 | 
                                    { 
 | 
                                        blackword += temp[pos + cursor].ToString(); 
 | 
                                        temp[pos + cursor] = filter; 
 | 
                                    } 
 | 
                                    catch (Exception e) 
 | 
                                    { 
 | 
                                        Debug.Log(e.Message); 
 | 
                                    } 
 | 
                                } 
 | 
                                cursor = cursor + wordlenght; 
 | 
                                i = i + wordlenght; 
 | 
  
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                    cursor++; 
 | 
                } 
 | 
                return new string(temp); 
 | 
            } 
 | 
            return string.Empty; 
 | 
        } 
 | 
  
 | 
        public static bool IsDirtWord(string source) 
 | 
        { 
 | 
            if (System.Text.Encoding.UTF8.GetByteCount(source) == 1) 
 | 
                return false; 
 | 
  
 | 
            if (source != string.Empty) 
 | 
            { 
 | 
                cursor = 0; 
 | 
                nextCursor = 0; 
 | 
                for (int i = 0; i < source.Length; i++) 
 | 
                { 
 | 
                    //查询以该字为首字符的词组 
 | 
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]]; 
 | 
                    if (group != null) 
 | 
                    { 
 | 
                        for (int z = 0; z < group.Count(); z++) 
 | 
                        { 
 | 
                            string word = group.GetWord(z); 
 | 
                            if (word.Length == 0 || Check(word, source)) 
 | 
                            { 
 | 
                                return true; 
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                    cursor++; 
 | 
                } 
 | 
            } 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        private static bool Check(string blackWord, string source) 
 | 
        { 
 | 
            wordlenght = 0; 
 | 
            int wordCnt = 0; 
 | 
            //检测源下一位游标 
 | 
            nextCursor = cursor + 1; 
 | 
            bool found = false; 
 | 
            //遍历词的每一位做匹配 
 | 
            for (int i = 0; i < blackWord.Length; i++) 
 | 
            { 
 | 
                //特殊字符偏移游标 
 | 
                int offset = 0; 
 | 
                if (nextCursor >= source.Length) 
 | 
                { 
 | 
                    break; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    //检测下位字符如果不是汉字 数字 字符 偏移量加1,,过滤特殊字符 
 | 
                    for (int y = nextCursor; y < source.Length; y++) 
 | 
                    { 
 | 
                        //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) { 
 | 
                        if (IsSpecial(source[y])) 
 | 
                        { 
 | 
                            offset++; 
 | 
                            //避让特殊字符,下位游标如果>=字符串长度 跳出 
 | 
                            if (nextCursor + offset >= source.Length) break; 
 | 
                            wordlenght++; 
 | 
  
 | 
                        } 
 | 
                        else break; 
 | 
                    } 
 | 
                    if (nextCursor + offset >= source.Length) 
 | 
                    { 
 | 
                        break; 
 | 
                    } 
 | 
                    if (blackWord[i] == char.ToLower(source[nextCursor + offset])) 
 | 
                    { 
 | 
                        wordCnt++; 
 | 
                        found = true; 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        found = false; 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
                nextCursor = nextCursor + 1 + offset; 
 | 
                wordlenght++; 
 | 
            } 
 | 
            if (blackWord.Length != wordCnt) return false; 
 | 
            return found; 
 | 
        } 
 | 
  
 | 
        private static bool IsSpecial(char character) 
 | 
        { 
 | 
            if (character == ' ') 
 | 
            { 
 | 
                return true; 
 | 
            } 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        static public void DirtyWordInit() 
 | 
        { 
 | 
            if (dirtyWordInited) 
 | 
            { 
 | 
                return; 
 | 
            } 
 | 
  
 | 
            dirtyWordInited = true; 
 | 
  
 | 
            ThreadPool.QueueUserWorkItem((object aaa) => 
 | 
            { 
 | 
                memoryList.Sort((string x, string y) => 
 | 
                { 
 | 
                    return x.CompareTo(y); 
 | 
                }); 
 | 
                for (int i = memoryList.Count - 1; i > 0; i--) 
 | 
                { 
 | 
                    if (memoryList[i].ToString() == memoryList[i - 1].ToString()) 
 | 
                    { 
 | 
                        memoryList.RemoveAt(i); 
 | 
                    } 
 | 
                } 
 | 
                foreach (string word in memoryList) 
 | 
                { 
 | 
                    WordGroup group = DIRTYWORLD[(int)word[0]]; 
 | 
                    if (group == null) 
 | 
                    { 
 | 
                        group = new WordGroup(); 
 | 
                        DIRTYWORLD[(int)word[0]] = group; 
 | 
                    } 
 | 
                    group.Add(word.Substring(1)); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        public static bool IsCHS(char character) 
 | 
        { 
 | 
            //  中文表意字符的范围 4E00-9FA5 
 | 
            int charVal = (int)character; 
 | 
            return (charVal >= 0x4e00 && charVal <= 0x9fa5); 
 | 
        } 
 | 
  
 | 
        private static bool IsNum(char character) 
 | 
        { 
 | 
            int charVal = (int)character; 
 | 
            return (charVal >= 48 && charVal <= 57); 
 | 
        } 
 | 
  
 | 
        private static bool IsAlphabet(char character) 
 | 
        { 
 | 
            int charVal = (int)character; 
 | 
            return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90)); 
 | 
        } 
 | 
  
 | 
        private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}"; 
 | 
        private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline); 
 | 
        public static string FitterSpecial(string source) 
 | 
        { 
 | 
            return FaceRegex.Replace(source, "     "); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    class WordGroup 
 | 
    { 
 | 
        private List<string> groupList; 
 | 
  
 | 
        public WordGroup() 
 | 
        { 
 | 
            groupList = new List<string>(); 
 | 
        } 
 | 
  
 | 
        public void Add(string word) 
 | 
        { 
 | 
            groupList.Add(word); 
 | 
        } 
 | 
  
 | 
        public int Count() 
 | 
        { 
 | 
            return groupList.Count; 
 | 
        } 
 | 
  
 | 
        public string GetWord(int index) 
 | 
        { 
 | 
            return groupList[index]; 
 | 
        } 
 | 
    } 
 |