游戏中敏感信息过滤

呵呵 老长时间没做总结了,今天有时间再写第二篇笔记

在游戏中的聊天室当然也可以是其他应用中的涉及到聊天敏感信息,如:政治性的某某的名字或人们给其封的代号、色情词语、脏话、游戏中敏感的信息等等,这些信息都需要过滤,过滤有很多算法,今天就先说下曾经用的一种较为简单的实例

package com.util.filter;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ZhangYude
 * @date   2012-10-12
 * @version 1.4
 * @since 2012
 * @desc:
 * 过滤关键词(可以来自文本或数据库)
 */
public class FilterContextKey {
    public static final String REPLACE_CONTEXT= "*";
    
    /**
     * 要过滤的关键词
     */
    public String key;

    public FilterContextKey(String key) {
        super();
        this.key = key;
    }
    
    public static List<FilterContextKey> loadFilterKeys(){
        List<FilterContextKey> list = new ArrayList<FilterContextKey>();
        list.add(new FilterContextKey("TMD"));
        list.add(new FilterContextKey("T M D"));
        list.add(new FilterContextKey("他妈的"));
        list.add(new FilterContextKey("他 妈 的"));
        list.add(new FilterContextKey("操"));
        list.add(new FilterContextKey("草"));
        list.add(new FilterContextKey("日"));
        list.add(new FilterContextKey("sb"));
        list.add(new FilterContextKey("s b"));
        return list;
    }
}






---------------------------------------------------------------------------------------------

package com.util.filter;

import java.util.HashMap;
import java.util.List;

/**
 * @author ZhangYude
 * @date   2012-10-12
 * @version 1.4
 * @since 2012
 * @desc:
 * 内容过滤器
 */
public class FilterContextUtil {

    /**
     * 过滤的关键词列表
     */
    private static HashMap<String,String> filterKeys;
    
    /**
     * 关键词的最大长度
     */
    private static int keyMaxLength;
    
    
    /**
     * 初始化信息
     */
    private static void initInfo(){
        List<FilterContextKey> filterKeysList = FilterContextKey.loadFilterKeys();
        int keyLength = 0;
        if(filterKeysList.size()>0){
            filterKeys = new HashMap<String,String>();
            keyMaxLength = 0;
            for(FilterContextKey key:filterKeysList){
                keyLength = key.key.length();
                //把要过滤的敏感词用“*”代替,放入到Map中,方便匹配
                filterKeys.put(key.key.toLowerCase(), getReplaceKey(keyLength));
                //找到过滤敏感词的最大长度
                if(keyMaxLength<keyLength){
                    keyMaxLength = keyLength;
                }
            }
        }
    }
    
    /**
     * 替换文字
     * @param n
     * @return
     */
    private static String getReplaceKey(int n) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < n; i++) {
            sb.append(FilterContextKey.REPLACE_CONTEXT);
        }
        return sb.toString();
    }
    /**
     * 过滤内容
     * @param context :被过滤的内容
     * @return
     */
    public static String filter(String context){
        String temp = context;
        context = context.replaceAll(" ", "");
        context = context.toLowerCase();
        boolean isInKeyList = false;
        if(filterKeys == null){
            initInfo();
        }else if(filterKeys != null && filterKeys.size() ==0){
            return context;
        }
        StringBuffer resultStr = new StringBuffer();
        String subStr = null;
        int subStrLength = 0;
        //从信息的第一个字符开始进行遍历
        for(int start=0; start<context.length(); start++){
            //分别取出长度为1、2、3。。。。最大敏感词的长度进行匹配
            for(int end=start+1; (end<=context.length() && end<start+keyMaxLength); end++){
                //截取字符串
                subStr = context.substring(start,end);
                subStrLength = subStr.length();
                //内容里面含有要过滤的字符串
                if(filterKeys.containsKey(subStr)){
                    resultStr = getFilterStr(resultStr, context, start, subStr);
                    //指向下一段过滤
                    context = getNextStr(context,start,subStrLength);
                    start = end = 0;
                    if(context == null){
                        context = "";
                    }
                    isInKeyList = true;
                }
            }
        }
        if(!isInKeyList){
            return temp;
        }
        resultStr.append(context);
        return resultStr.toString();
    }

    /**
     * 得到当前过滤的后半段信息
     * @param context : 待过滤的信息
     * @param start : 过滤开始位置
     * @param subStrLength : 待过滤字符串的长度
     * @return
     */
    private static String getNextStr(String context, int start, int subStrLength) {
        String str = null;
        if(start == 0){
            str = context.substring(subStrLength);
        }else if(start + subStrLength < context.length()){
            str = context.substring(start + subStrLength);
        }
        return str;
    }

    /**
     * 得到当前过滤的前半段信息
     * @param resultStr :待返回结果信息
     * @param context :待过滤的信息
     * @param start :过滤开始位置
     * @param subStr :当前要过滤的字符串
     * @return
     */
    private static StringBuffer getFilterStr(StringBuffer resultStr, String context, int start, String subStr) {
        if(start != 0){
            resultStr.append(context.substring(0, start));
        }
        resultStr.append(filterKeys.get(subStr));
        return resultStr;
    }

    public static void main(String[] args) {
        System.out.println(FilterContextUtil.filter("草泥马,tmd今天你怎么了?"));
    }
}

===========================================================================================================================
*泥马,***今天你怎么了?


此demo适合于轻量级的过滤,如果数据量大的可能不适

posted on 2013-07-25 10:21  zyd915  阅读(380)  评论(0编辑  收藏  举报

导航