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

当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打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. 面试题之实现系统函数系列一:实现memmove函数

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  2. Dubbo简单DEMO以及重要配置项

    DEMO pom.xml 消费方和服务提供方一致 <properties> <spring.version>4.0.6.RELEASE</spring.version&g ...

  3. How To Install Nginx on Ubuntu 16.04 zz

    Introduction Nginx is one of the most popular web servers in the world and is responsible for hostin ...

  4. Convert Sorted List to Binary Search Tree&&Convert Sorted Array to Binary Search Tree——暴力解法

    Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...

  5. cocos2d-x addImageAsync()异步加载资源成功之后的场景跳转问题

    http://blog.csdn.net/w20175357/article/details/23546985 1.先说说addImageAsync()异步加载图片的问题 做游戏的时候现在资源的比较大 ...

  6. 洛谷——P2388 阶乘之乘

    P2388 阶乘之乘 题目背景 不告诉你…… 题目描述 求出1!*2!*3!*4!*……*n!的末尾有几个零 输入输出格式 输入格式: n(n<=10^8) 输出格式: 有几个零 输入输出样例 ...

  7. CentOS7网络自动连接

    1)在root用户下使用命令"vim /etc/sysconfig/network-scripts/ifcfg-XXX",其中"ifcfg-XXX"的" ...

  8. c++风格

    http://web.archive.org/web/20160430022340/http://google.github.io/styleguide/cppguide.html 主要注意几点: 函 ...

  9. ASP.NET总结——更改后

    这篇重新整理的总结,我做了很久,也在草稿箱中放了很久,一直感觉没有达到和老师谈话后的水平,感觉还是需要增加一些修改,希望读者能提出宝贵意见.既这篇博客之前,我发表了一篇ASP.net的总结,在结构上, ...

  10. 【Floyd】文化之旅

    [NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...