所谓字符过滤器,常常用在聊天的内容,比如一连串的骂人难听的话,我们要屏蔽掉,避免造成不好的东西!

当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打LOL的时候,算了不讲了,都是泪啊。

我们来看看这款游戏字符过滤是怎么实现的,结合我上节讲到的单例类,因为字符过滤类当然是个单例类。

public class WordFilter : Singleton<WordFilter>
{
private string[] m_StringFilters;
private Dictionary<int, string> m_Replacers = new Dictionary<int, string>();
public void Init()//先从Init开始看
{
string fullPath = ResourceManager.GetFullPath("config/table/language_filter.txt", false);//这个是你要过滤的词汇,这个txt里面存的都是不好的string
this.m_StringFilters = File.ReadAllLines(fullPath);//从txt中读取string存到m_StringFilters中
for (int i = 0; i < this.m_StringFilters.Length; i++)
{
string text = this.m_StringFilters[i].ToLower();
this.m_StringFilters[i] = text;//都变成小写格式
int length = text.Length;//单个string的长度
string text2 = new string('*', length);//根据要过滤字符的长度构造等长的*字符串
if (text2.Equals(text))//如果等于过滤的字符,那个这个就为空,其实就是用户不小心修改要过滤字符等于*,其实没必要
{
this.m_StringFilters[i] = null;
}
else
{
if (!this.m_Replacers.ContainsKey(length))//m_Replacers是个字典,key:length=>value:*,也就是多少长度的*字符串
{
this.m_Replacers.Add(length, text2);//如果不存在这个长度就加入
}
}
}
}
public bool FilterString(ref string originalString)//这个是过滤的核心代码,之前是初始化,主要初始过滤字符数组和过滤*字典
{
string a = originalString;//你聊天的一句话(注意是一整句)
string text = originalString.ToLower();//搞成小写
string[] stringFilters = this.m_StringFilters;
for (int i = 0; i < stringFilters.Length; i++)
{
string text2 = stringFilters[i];
if (!string.IsNullOrEmpty(text2))//不为空
{
int num = 0;
while (true)
{
num = text.IndexOf(text2, num);//从index=0开始,寻找text(也就是聊天的话)中第一个等于text2(也就是不好的string)的index
if (-1 == num)//也就是没找到就跳出循环
{
break;
}
string str = originalString.Substring(0, num);//截断聊天语句不好词的前面字符串
string str2 = originalString.Substring(num + text2.Length);//截断聊天语句不好词后面的字符串,直到结束
originalString = str + this.m_Replacers[text2.Length] + str2;//吧不好的词替换成*字符
str = text.Substring(0, num);//为什么要改text呢,主要是为了跳出循环,当text不再含有不好词,num就为-1,然后break
str2 = text.Substring(num + text2.Length);
text = str + this.m_Replacers[text2.Length] + str2;
}
}
}
return a == originalString;//判断originalString是否改了,如果改了就说明过滤了,返回false,如果没改就返回true
}
}

  

所以,我们聊天的string都需要经过过滤字符类的方法FilterString处理。

因为FilterString的参数是ref 引用类型,所以只要有不好的词就会改变原来的聊天语句。

最新文章

  1. nodejs的实现原理和搭建服务器(动态)
  2. 浅谈UI设计中妙用无穷的深色系背景
  3. SQLServer : EXEC和sp_executesql的区别
  4. mysql forget root password
  5. 深入学习JavaScript(一)
  6. PHP分页类库
  7. [CF676C]Vasya and String(尺取法,原题)
  8. Redis 脚本
  9. H5小内容(四)
  10. Linux下软件的安装
  11. FZU 2099 魔法阵
  12. 《你不知道的JavaScript》整理(五)——值与原生函数
  13. EF架构~Migration数据迁移的执行顺序
  14. WebAPi接口安全之公钥私钥加密
  15. mybatis的generator中xml配置问题
  16. PHP开发API接口签名及验证
  17. Atitit 项目版本管理gitflow 与 Forking的对比与使用
  18. 【QT】无需写connect代码关联信号和槽函数
  19. zookeeper集群的搭建(三台相同)
  20. VS2015终极卸载方法

热门文章

  1. mac pro 安装mysql并且配置my.cnf(添加默认字符集utf8,数据存放路径,修改已经建好的表的默认字符集等)、mac mysql my.cnf路径
  2. Google Guice 之绑定1
  3. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记9——游戏摄像机&amp;三维地形的构建
  4. OFBIZ 10.04 开发环境搭建(ofbiz+mysql+eclipse)
  5. Go语言建立一个最简单的服务端点
  6. jquery实现页面加载时删除特定class 的div内前三个字符
  7. hdu5731
  8. Genymotion的2个问题及解决方法
  9. pytho中pickle、json模块
  10. flutter vscode插件