Unity中使用的一套敏感词过滤方式

当项目中的敏感词数量不是很多的时候,直接用数组来遍历过滤其实也可以,但是具体的数量有多大,这个肯定不好说,因此,对.txt中的敏感词合理组织后再进行过滤就显得非常有必要了。

如上图,左边是txt中配置的敏感词,右边是需要转换为的数据结构(C#中的Dictory来存储即可)

下面那句话是一个示例,即需要过滤敏感词的句子。

具体的实现代码:

 1 using System;
 2 using System.IO;
 3 using System.Collections;
 4 using UnityEngine;
 5 using Common;
 6 using System.Collections.Generic;
 7 using System.Text;
 8 
 9 public class FilterSensitiveWords
10 {
11     static string[] sensitiveWordsArray = null;
12     static string fileName = "sensitivewords.u";
13     static string ReplaceValue = "*";
14     static Dictionary<char, IList<string>> keyDict;
15 
16     public static void Initialize()
17     {
18         string path = "txt/sensitivewords.u";
19         string name = "sensitivewords";
20         LoadHelp.LoadAssetBundle(path, name, ar =>
21         {
22             string content = ar.Bundle.LoadAsset<TextAsset>(name).text;
23             if (!(content.Equals("") || content.Equals(null)))
24             {
25                 sensitiveWordsArray = content.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
26 
27                 keyDict = new Dictionary<char, IList<string>>();
28                 foreach (string s in sensitiveWordsArray)
29                 {
30                     if (string.IsNullOrEmpty(s))
31                         continue;
32                     if (keyDict.ContainsKey(s[0]))
33                         keyDict[s[0]].Add(s.Trim(new char[] { '\r' }));
34                     else
35                         keyDict.Add(s[0], new List<string> { s.Trim(new char[] { '\r' }) });
36                 }
37             }
38         });
39     }
40 
41     //判断一个字符串是否包含敏感词,包括含的话将其替换为*
42     public static bool IsContainSensitiveWords(ref string text, out string SensitiveWords)
43     {
44         bool isFind = false;
45         SensitiveWords = "";
46         if (null == sensitiveWordsArray || string.IsNullOrEmpty(text))
47             return isFind;
48 
49         int len = text.Length;
50         StringBuilder sb = new StringBuilder(len);
51         bool isOK = true;
52         for (int i = 0; i < len; i++)
53         {
54             if (keyDict.ContainsKey(text[i]))
55             {
56                 foreach (string s in keyDict[text[i]])
57                 {
58                     isOK = true;
59                     int j = i;
60                     foreach (char c in s)
61                     {
62                         if (j >= len || c != text[j++])
63                         {
64                             isOK = false;
65                             break;
66                         }
67                     }
68                     if (isOK)
69                     {
70                         SensitiveWords = s;
71                         isFind = true;
72                         i += s.Length - 1;
73                         sb.Append('*', s.Length);
74                         break;
75                     }
76 
77                 }
78                 if (!isOK)
79                     sb.Append(text[i]);
80             }
81             else
82                 sb.Append(text[i]);
83         }
84         if (isFind)
85             text = sb.ToString();
86 
87         return isFind;
88     }
89 }

猜你喜欢

转载自www.cnblogs.com/luguoshuai/p/9254190.html