- 最后登录
- 2019-12-2
- 注册时间
- 2012-8-25
- 阅读权限
- 90
- 积分
- 34660
- 纳金币
- 38268
- 精华
- 111
|
前一段时间项目需要用到关键词过滤功能,在网上找了找,现成的好像都不太好用,调用麻烦不说,测试了一下还经常出错,所以一狠心自己写了一套,也没有想象中的麻烦。
最简单的算法,就是直接取出过滤词表里的所有词,直接替换,但是策划同学们提出了一个额外需求,需要可以控制过滤的深度,比如说一个关键字是“哈哈”,那么策划需要可以控制是否过滤“哈1哈”和“哈12哈”这样的词,这就比较麻烦了。
翻了翻正则表达式,没什么头绪(个人不太擅长正则),最后还是用的字符串比对的方法,先检查一下目标字符串里有没有关键词的第一个字,有的话检查有没有第二个,还有的话判断一下这两个字之间的距离,是否大于了策划需要的深度,以此类推。
最后直接上源码了,需要注意的是使用之前要传一个字符串数组(过滤词数组)进来给s_filters。- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Text.RegularExpressions;
- public abstract class WordFilter
- {
- public static string[] s_filters = null;
- public static bool filter(string content, out string result_str, int filter_deep = 1, bool check_only = false, bool bTrim = false, string replace_str = "*")
- {
- string result = content;
- if (bTrim)
- {
- result = result.Trim();
- }
- result_str = result;
- if (s_filters == null)
- {
- return false;
- }
- bool check = false;
- foreach (string str in s_filters)
- {
- string s = str.Replace(replace_str, "");
- if (s.Length == 0)
- {
- continue;
- }
- bool bFiltered = true;
- while (bFiltered)
- {
- int result_index_start = -1;
- int result_index_end = -1;
- int idx = 0;
- while (idx < s.Length)
- {
- string one_s = s.Substring(idx, 1);
- if (one_s == replace_str)
- {
- continue;
- }
- if (result_index_end + 1 >= result.Length)
- {
- break;
- }
- int new_index = result.IndexOf(one_s, result_index_end + 1, StringComparison.OrdinalIgnoreCase);
- if (new_index == -1)
- {
- bFiltered = false;
- break;
- }
- if (idx > 0 && new_index - result_index_end > filter_deep + 1)
- {
- bFiltered = false;
- break;
- }
- result_index_end = new_index;
- if (result_index_start == -1)
- {
- result_index_start = new_index;
- }
- idx++;
- }
- if (bFiltered)
- {
- if (check_only)
- {
- return true;
- }
- check = true;
- string result_left = result.Substring(0, result_index_start);
- for (int i = result_index_start; i <= result_index_end; i++)
- {
- result_left += replace_str;
- }
- string result_right = result.Substring(result_index_end + 1);
- result = result_left + result_right;
- }
- }
- }
- result_str = result;
- return check;
- }
- }
复制代码 |
|