- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
-
-
-
-
-
-
-
-
-
- public class WordFilter {
- private static Map<Character,List<String>> wordListToMap(List<String> sensitiveWordList){
- Map<Character,List<String>> result=new HashMap<Character,List<String>>();
- for (String s:sensitiveWordList){
- char c=s.charAt(0);
- List<String> strs=result.get(c);
- if (strs==null){
- strs=new ArrayList<String>();
- result.put(c,strs);
- }
- strs.add(s);
- }
-
- return result;
- }
-
- public static String filter(String src,List<String> sensitiveWordList){
- Map<Character,List<String>> wordMap=wordListToMap(sensitiveWordList);
-
- StringBuilder strb=new StringBuilder();
- for (int i=0;i<src.length();i++){
- char c=src.charAt(i);
- String find=null;
- if (wordMap.containsKey(c)){
- List<String> words=wordMap.get(c);
- for (String s:words){
- String temp=src.substring(i,(s.length()<=(src.length()-i))?i+s.length():i);
- if (s.equals(temp)){
- find=s;
- break;
- }
- }
- }
- if (find!=null){
- strb.append("***");
- i+=(find.length()-1);
- } else {
- strb.append(c);
- }
- }
- return strb.toString();
- }
-
-
-
- public static void main(String[] args) {
- List<String> wordList=new ArrayList<String>();
- wordList.add("TMD");
- wordList.add("变态");
- System.out.println(filter("你TMD,也太缺德了吧",wordList));
- System.out.println(filter("你TMD,也太缺德了TMD吧",wordList));
- System.out.println(filter("你TMD,也太缺德了吧TM",wordList));
- System.out.println(filter("你TMD,也太缺德了,太变态了吧TM",wordList));
- wordList.add("TM");
- System.out.println(filter("你TMD,也太缺德了,太变态了吧TM",wordList));
- }
-
- }
----------------------------- 问:开始真实的项目(网站或系统)肯定要过滤用户输入的一些敏感字符,那么请问这些敏感字符是不是需要在数据库里也过滤掉?比如用户输入了"河蟹",那么过滤器会把它替换成**,那么插入到数据库里的数据一般是原内容还是替换后的呢?
真实的开发中,这方面一般是怎么做的,谢谢!
答: 我现在的wap网站项目是只在显示的时候加上过滤处理。
数据库存放的是原始用户数据。
如果存放数据库就过滤,那么调整关键词后那些替换过的** 就没法恢复了。
|