某游戏研究之字符过滤类-WorldFilter

news/2024/11/7 9:26:16/

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

 

当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打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里面存的都是不好的stringthis.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)的indexif (-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,然后breakstr2 = text.Substring(num + text2.Length);text = str + this.m_Replacers[text2.Length] + str2;}}}return a == originalString;//判断originalString是否改了,如果改了就说明过滤了,返回false,如果没改就返回true}}

  

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

 

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


http://www.ppmy.cn/news/777133.html

相关文章

XXE详解

一、XML基础知识 1、XML简介&#xff1a; XML用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文…

Mysql截取字符串(含指定字符串)

项目场景&#xff1a; 在将数据落地到数据库后&#xff0c;应业务需求&#xff0c;需要截取特定数据用作另一字段值&#xff1b;如&#xff1a;现有字段areaName值为&#xff1a;海南省东方市…&#xff0c;现想将areaName省份信息截取存到province 问题描述 网上搜罗一圈&am…

《黑马程序员》C++提高编程(三)

0.写在前面 本篇笔记视频讲解地址&#xff1a;https://www.bilibili.com/video/BV1et411b73Z?p1笔记配合视频效果更好外链图片上传失败已经解决&#xff0c;手动校正&#xff0c;如有错误和遗漏&#xff0c;可私信与评论进行指正&#xff0c;看到了会及时更改与各位共勉用来复…

过滤特殊字符及表情符

//这个我从逆向考虑&#xff0c;找出常用合法的字符&#xff0c;其他为非法&#xff0c;过滤即可public String stringFilter(String str) throws PatternSyntaxException { // 只允许字母和数字和中文//[\\pP‘’“” String regEx "^[A-Za-z\\d\\u4E00-\\u9FA5\\p{P…

怎么用计算机打出cpdd,网络语cpdd是什么梗啥意思 cpdd出处来源哪里常见用法介绍...

原标题&#xff1a;网络语cpdd是什么梗啥意思 cpdd出处来源哪里常见用法介绍 [海峡网] 随着网络的快速发展&#xff0c;抖音和微博这样的软件也是越来越火&#xff0c;因此很多流行语就随之诞生&#xff0c;特别是在抖音里&#xff0c;经常看到游戏相关的用语&#xff0c;比如桃…

SSM—mybatis框架-注解开发-动态sql(where,set,trim,choose,when,foreach)-模糊查询写法-特殊符号处理-缓存

文章目录 2.0、注解2.1、动态sql2.1.1、where2.1.2、set2.1.3、trim2.1.3.1、trim的where2.1.3.2、trim的set 2.1.4.1、choose2.1.5.1、foreach2.1.6、模糊查询3种方法2.1.7、特殊符号处理 2.2、缓存2.2.0、缓存简述2.2.1、一级缓存2.2.2、二级缓存 2.0、注解 简单的sql语句可…

使用matlab批量裁剪矢量数据

使用MATLAB批量裁剪矢量数据的详细过程&#xff1a; 1. 首先&#xff0c;需要将需要裁剪的矢量数据文件保存在一个文件夹中&#xff0c;例如 "C:\Vector Data\"。 2. 在MATLAB中&#xff0c;使用 cd 命令将当前工作目录更改为包含矢量数据文件的文件夹。例如&#…

基于MATLAB的简单线性回归详解

概要 在机器学习领域中大多数任务通常都与预测&#xff08;prediction&#xff09;有关。当我们想预测一个数值时&#xff0c;就会涉及到回归问题。常见的例子包括&#xff1a;预测价格&#xff08;房屋、股票等&#xff09;、预测住院时间&#xff08;针对住院病人等&#xff…