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

当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打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 引用类型,所以只要有不好的词就会改变原来的聊天语句。

某游戏研究之字符过滤类-WorldFilter的更多相关文章

  1. 华为-on练习--重复的字符过滤

    称号: 请写一个字符串过滤程序,如果使用多个相同的字符出现在字符串中,字符首次出现在非过滤,. 比方字符串"abacacde"过滤结果为"abcde". 演示样 ...

  2. java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

    转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可 ...

  3. php安全过滤类

    /*ansic码-Url码表: http://www.w3school.com.cn/tags/html_ref_urlencode.html ---------------------------- ...

  4. swift 字符转为类,代码创建控件

    在使用类之前要先获得 命名空间 通过json来获取 字符型的类名 然后创建类对象,这时候就要用到字符转类 // 从info字典中获取到 命名空间 转为字符型 let NS = NSBundle.mai ...

  5. java 非法字符过滤 , 半角/全角替换

    java 非法字符过滤 , 半角/全角替换 package mjorcen.netty.test1; import java.io.UnsupportedEncodingException; publ ...

  6. javaio学习笔记-字符流类(1)

    1.java.io包中的字符流类-BufferedReader和BufferedWriter: BufferedReader:缓存的输入字符流; BufferedWriter:缓存的输出字符流; In ...

  7. 深入研究java.lang.ProcessBuilder类

     深入研究java.lang.ProcessBuilder类 一.概述       ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它 ...

  8. asp.net 字符帮助类 类型转换类

    /// <summary> /// 字符帮助类 /// </summary> public class StringHelper { private static readon ...

  9. javaio学习笔记-字符流类(2)

    1.java.io包中的字符流类-FileReader和FileWriter: BufferedReader:缓存的输入字符流; BufferedWriter:缓存的输出字符流; FileReader ...

随机推荐

  1. ==和equals()方法的区别

    ==和equals()方法的区别 这是一道经典的面试题,但是很多人对其一直很困惑,最近刚好复习了他们两者的区别,现总结如下: 一.==:两端可以存放不同的数据     1.放基本数据类型:根据基本数据 ...

  2. 去掉a标签的虚线框,避免出现奇怪的选中区域

    a{blr:expression(this.onFocus=this.blur())}/*去掉a标签的虚线框,避免出现奇怪的选中区域*/

  3. MYSQL 索引无效和索引有效的详细介绍

    1.WHERE字句的查询条件里有不等于号(WHERE column!=...),MYSQL将无法使用索引 2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)= ...

  4. HDU-1671

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. MySQL 的数据存储引擎

    MySQL的存储引擎 InnoDB: MySQL5.5之后的默认存储引擎. 采用MVCC来支持高并发,并且实现了四个标准的隔离级别(默认可重复读). 支持事务,支持外键.支持行锁.非锁定读(默认读取操 ...

  6. Delphi使程序的窗口出现在最前面并激活

    procedure setAppFront(); //使程序的窗口出现在最前面并激活 var pt, OldPt, NewPt: TPoint; begin //判断Application是否最小化, ...

  7. Java学习笔记(一)——关于java中的String类

    [前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较 ...

  8. .net core 2.0学习记录(三):内置IOC与DI的使用

    本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...

  9. Openstack 云主机深入了解 (十六)

    一)云主机深入了解 1.云主机在计算节点以进程方式运行 2.监听vnc的端口,vnc默认端口从5900开始, 多台云主机,端口递增 3.云主机桥接网卡,与宿主机联通网络 提示:在openstack环境 ...

  10. 【剑指offer】面试题 15. 二进制中 1 的个数

    面试题 15. 二进制中 1 的个数 题目描述 题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. Java 实现 方法一 public class Solution { // y ...