呵呵 老長時間沒作總結了,今天有時間再寫第二篇筆記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適合於輕量級的過濾,若是數據量大的可能不適數據庫