呵呵 老长时间没作总结了,今天有时间再写第二篇笔记java
在游戏中的聊天室固然也能够是其余应用中的涉及到聊天敏感信息,如:政治性的某某的名字或人们给其封的代号、色情词语、脏话、游戏中敏感的信息等等,这些信息都须要过滤,过滤有不少算法,今天就先说下曾经用的一种较为简单的实例算法
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++){ //分别取出长度为一、二、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适合于轻量级的过滤,若是数据量大的可能不适数据库