| using System; | 
| using System.Collections.Generic; | 
| using System.Text.RegularExpressions; | 
| using UnityEngine; | 
| using System.Threading; | 
|   | 
| public partial class DirtyNameConfig : ConfigBase<int, DirtyNameConfig> | 
| { | 
|   | 
|     private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue]; | 
|   | 
|     private static List<string> memoryList = new List<string>(); | 
|   | 
|     private static bool dirtyNameInited = false; | 
|   | 
|     static int cursor = 0; | 
|   | 
|     static int wordlenght = 0; | 
|   | 
|     static int nextCursor = 0; | 
|   | 
|     protected override void OnConfigParseCompleted() | 
|     { | 
|         if (string.IsNullOrEmpty(word)) | 
|         { | 
|             Debug.LogErrorFormat("屏蔽名字 id = {0} 的内容为空 需要修改", id); | 
|             return; | 
|         } | 
|         string key = ToDBC(word); | 
|         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 bool IsDirtName(string source) | 
|     { | 
|         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 ((int)blackWord[i] == (int)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 DirtyNameInit() | 
|     { | 
|         if (dirtyNameInited) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         dirtyNameInited = 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, "     "); | 
|     } | 
| } |