网站公告 | 泰斗网校全新上线了,可以和论坛用户登录同步,如果遇到登录问题联系管理员解决
查看: 5348|回复: 4
收起左侧

[旅行的拾荒者] 简单的游戏屏蔽字检测实现

[复制链接]

[旅行的拾荒者] 简单的游戏屏蔽字检测实现[复制链接]

旅行的拾荒者 发表于 2018-4-3 16:04:46 [显示全部楼层] 回帖奖励 |倒序浏览 |阅读模式 回复:  4 浏览:  5348
屏蔽字检测类【ShieldedWordData.cs】
[C#] 纯文本查看 复制代码
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class ShieldedWordData
{

    protected static ShieldedWordData _Instance;
    public static ShieldedWordData Instance()
    {
        return _Instance ?? (_Instance = new ShieldedWordData());
    }

    private List<Regex> _regexList;
    
    public  void Check(string Id2Desc )
    {
        this._regexList = new List<Regex>();
        string txt = Id2Desc;
        string[] lines = txt.Split('|');
        for (int i = 0; i < lines.Length; i++)
        {
            string word = lines[ i ];
            Regex reg = new Regex(word);
            this._regexList.Add(reg);
        }
    }

    //检查输入文本中是否包含屏蔽字
    public bool isWord( string name )
    {
        int len = this._regexList.Count;
        for (int i = 0; i < len; i++)
        {
            Regex regex = this._regexList[ i ];
            if (regex.IsMatch(name))
            {
                return false;
            }
        }
        return true;
    }
}


测试类【Test.cs】
[C#] 纯文本查看 复制代码
using LitJson;
using System.Linq;
using UnityEngine;

public class Test : MonoBehaviour
{
    public TextAsset txt;
    void Awake()
    {
        JsonData data = JsonMapper.ToObject(txt.text);
        ShieldedWordData.Instance().Check(data[ 0 ].ToString());
        Debug.Log("是否包含屏蔽字:"+(CheckStringValid("[backcolor=rgb(249, 249, 249)]总书记[/backcolor]" , true)?"是":"否"));
    }
    

    /// <summary>
    /// 监测特殊字符
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool ValidCheckSpecialChara( string value )
    {
        string InValidChara = "\"'{}[]:,";
        for (int i = 0; i < InValidChara.Length; i++)
        {
            char chara = InValidChara[ i ];
            if (value.Contains(chara))
            {
                return true;
            }
        }
        return false;
    }



    /// <summary>
    /// 检查是否含有非法字符
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool CheckStringValid( string value , bool ignoreSpecialCharac = false )
    {
        if (!ignoreSpecialCharac && !ValidCheckSpecialChara(value))
        {
            return false;
        }
        if (ShieldedWordData.Instance().isWord(value))
        {
            return false;
        }
        return true;
    }

}


测试屏蔽字
{
"word":"总书记|中央政治局委员|打倒共产党|共产党|反共|共党|共匪"
}
上面的查找方式是使用正则表达式在词语中做全词匹配,还有一种方法,是使用Trie树的方式检测屏蔽字。相对来说效率会更高一些,检测更准确,当然相对于上面代码也更加复杂一些,感兴趣的同学,可到我的个人博客查看,有时间的时候我会把内容copy到泰斗社区。
游戏屏蔽词库校验 | 拾荒者 http://www.shihuangzhe.org/?p=290



+1
5344°C
4
  • frankwswswws
  • 旅行的拾荒者
  • 旅行的拾荒者
  • aslia
过: 他们
因分享而快乐,学习以自强!
frankwswswws 发表于 2018-4-4 10:03:13 显示全部楼层
这个好,那么怎么替换成 星号 之类的?
因分享而快乐,学习以自强!
旅行的拾荒者
 楼主|
发表于 2018-4-4 14:03:04 显示全部楼层
frankwswswws 发表于 2018-4-4 10:03
这个好,那么怎么替换成 星号 之类的?

替换成星号,可以使用下面我给出的链接(使用字典树的方法),逐字匹配检测屏蔽字,检测到了直接替换即可。
因分享而快乐,学习以自强!
旅行的拾荒者
 楼主|
发表于 2018-4-4 14:04:17 显示全部楼层
frankwswswws 发表于 2018-4-4 10:03
这个好,那么怎么替换成 星号 之类的?

上面的方法,也可以全词替换,但是上面的方法,局限性很大。
因分享而快乐,学习以自强!
aslia 发表于 2018-7-31 15:31:15 显示全部楼层
6666666666666666666666
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ