分享

Java 过滤敏感字的算法

 CevenCheng 2011-01-27

 

  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. /** 
  7.  * 算法思路:把敏感词的第一个字符取出来,作为比较对象。 
  8.  * 遍历整个字符串,如果发现字符跟敏感词第一个字符相同, 
  9.  * 就从字符串取出跟关键词相同长度的子串比较,如果相同就替换 
  10.  *  
  11.  * 本算法比较适合敏感词都不长的场合 
  12.  * @author Administrator 
  13.  * 
  14.  */  
  15. public class WordFilter {  
  16.     private static Map<Character,List<String>> wordListToMap(List<String> sensitiveWordList){  
  17.         Map<Character,List<String>> result=new HashMap<Character,List<String>>();  
  18.         for (String s:sensitiveWordList){  
  19.             char c=s.charAt(0);  
  20.             List<String> strs=result.get(c);  
  21.             if (strs==null){  
  22.                 strs=new ArrayList<String>();  
  23.                 result.put(c,strs);  
  24.             }  
  25.             strs.add(s);  
  26.         }  
  27.           
  28.         return result;  
  29.     }  
  30.       
  31.     public static String filter(String src,List<String> sensitiveWordList){  
  32.         Map<Character,List<String>> wordMap=wordListToMap(sensitiveWordList);  
  33.           
  34.         StringBuilder strb=new StringBuilder();  
  35.         for (int i=0;i<src.length();i++){  
  36.             char c=src.charAt(i);  
  37.             String find=null;  
  38.             if (wordMap.containsKey(c)){  
  39.                 List<String> words=wordMap.get(c);  
  40.                 for (String s:words){  
  41.                     String temp=src.substring(i,(s.length()<=(src.length()-i))?i+s.length():i);  
  42.                     if (s.equals(temp)){  
  43.                         find=s;  
  44.                         break;  
  45.                     }  
  46.                 }  
  47.             }  
  48.             if (find!=null){  
  49.                 strb.append("***");  
  50.                 i+=(find.length()-1);  
  51.             } else {  
  52.                 strb.append(c);  
  53.             }  
  54.         }  
  55.         return strb.toString();  
  56.     }  
  57.     /** 
  58.      * @param args 
  59.      */  
  60.     public static void main(String[] args) {  
  61.         List<String> wordList=new ArrayList<String>();  
  62.         wordList.add("TMD");  
  63.         wordList.add("变态");  
  64.         System.out.println(filter("你TMD,也太缺德了吧",wordList));  
  65.         System.out.println(filter("你TMD,也太缺德了TMD吧",wordList));  
  66.         System.out.println(filter("你TMD,也太缺德了吧TM",wordList));  
  67.         System.out.println(filter("你TMD,也太缺德了,太变态了吧TM",wordList));  
  68.         wordList.add("TM");  
  69.         System.out.println(filter("你TMD,也太缺德了,太变态了吧TM",wordList));  
  70.     }  
  71.   
  72. }  


-----------------------------
问:开始真实的项目(网站或系统)肯定要过滤用户输入的一些敏感字符,那么请问这些敏感字符是不是需要在数据库里也过滤掉?比如用户输入了"河蟹",那么过滤器会把它替换成**,那么插入到数据库里的数据一般是原内容还是替换后的呢?
真实的开发中,这方面一般是怎么做的,谢谢!

答:
我现在的wap网站项目是只在显示的时候加上过滤处理。
数据库存放的是原始用户数据。

如果存放数据库就过滤,那么调整关键词后那些替换过的** 就没法恢复了。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约