230 lines
5.0 KiB
C#
230 lines
5.0 KiB
C#
|
|
/*
|
||
|
|
********************************************************************************
|
||
|
|
*Copyright(C),coolae.net
|
||
|
|
*Author: chenbin
|
||
|
|
*Version: 2.0
|
||
|
|
*Date: 2017-01-09
|
||
|
|
*Description: 屏蔽字处理
|
||
|
|
*Others:
|
||
|
|
*History:
|
||
|
|
*********************************************************************************
|
||
|
|
*/
|
||
|
|
using UnityEngine;
|
||
|
|
using System.Collections;
|
||
|
|
|
||
|
|
namespace Coolape
|
||
|
|
{
|
||
|
|
public class BlockWordsTrie
|
||
|
|
{
|
||
|
|
private static BlockWordsTrie _self = null;
|
||
|
|
|
||
|
|
private BlockWordsTrie()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public static BlockWordsTrie getInstanse()
|
||
|
|
{
|
||
|
|
if (_self == null) {
|
||
|
|
_self = new BlockWordsTrie();
|
||
|
|
}
|
||
|
|
return _self;
|
||
|
|
}
|
||
|
|
|
||
|
|
private const int matchLength = 1;
|
||
|
|
private Hashtable node = new Hashtable();
|
||
|
|
|
||
|
|
public void init(string shieldWords)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrEmpty(shieldWords)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
string[] conts = shieldWords.Split("\n\t".ToCharArray());
|
||
|
|
foreach (string item in conts) {
|
||
|
|
Add(item);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Add(string content)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrEmpty(content)) {
|
||
|
|
//Debug.LogError("==== Trie content null ====");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
content = content.ToLower();
|
||
|
|
char[] contentChars = content.ToCharArray();
|
||
|
|
Hashtable parent = node;
|
||
|
|
Hashtable currentNode = node;
|
||
|
|
int len = contentChars.Length;
|
||
|
|
for (int i = 0; i < len; i++) {
|
||
|
|
char current = contentChars [i];
|
||
|
|
if (parent [current] == null) {
|
||
|
|
currentNode = new Hashtable();
|
||
|
|
if (i == len - 1) {
|
||
|
|
currentNode ["isEnd"] = "1";
|
||
|
|
} else {
|
||
|
|
currentNode ["isEnd"] = "0";
|
||
|
|
}
|
||
|
|
parent [current] = currentNode;
|
||
|
|
parent = currentNode;
|
||
|
|
} else {
|
||
|
|
parent = (Hashtable)parent [current];
|
||
|
|
if (parent != null) {
|
||
|
|
if (i == len - 1) {
|
||
|
|
parent ["isEnd"] = "1";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool isExistChar(char first)
|
||
|
|
{
|
||
|
|
return node [first] != null;
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool isExistCharArrays(char[] text, int begin, int length)
|
||
|
|
{
|
||
|
|
bool result = true;
|
||
|
|
Hashtable parent = node;
|
||
|
|
int size = begin + length;
|
||
|
|
for (int i = begin; i < size; i++) {
|
||
|
|
char current = text [i];
|
||
|
|
if (parent [current] != null) {
|
||
|
|
parent = (Hashtable)parent [current];
|
||
|
|
} else {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parent.Keys.Count > 0) {
|
||
|
|
object o_end = parent ["isEnd"];
|
||
|
|
if (o_end != null) {
|
||
|
|
string isEnd = o_end.ToString();
|
||
|
|
if (isEnd == "1") {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
/*
|
||
|
|
public bool isExistStr(string content){
|
||
|
|
char[] contentChars= content.ToCharArray();
|
||
|
|
bool result =true;
|
||
|
|
Hashtable parent=node;
|
||
|
|
foreach(char current in contentChars){
|
||
|
|
if(parent[current]!=null){
|
||
|
|
parent= (Hashtable) parent[current];
|
||
|
|
}else{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(parent.Keys.Count>0){
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 过滤关键字
|
||
|
|
* @param text
|
||
|
|
* @return
|
||
|
|
*/
|
||
|
|
public string filter(string text)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrEmpty(text)) {
|
||
|
|
return text;
|
||
|
|
}
|
||
|
|
text = text.ToLower();
|
||
|
|
char[] chars = text.ToCharArray();
|
||
|
|
filterCharArrays(chars, 0, matchLength, null);
|
||
|
|
return new string(chars);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void filterCharArrays(char[] chars, int begin_, int length, Hashtable replaceMap)
|
||
|
|
{
|
||
|
|
int all_len = chars.Length;
|
||
|
|
if (replaceMap == null) {
|
||
|
|
replaceMap = new Hashtable();
|
||
|
|
}
|
||
|
|
bool is_containKey = replaceMap.ContainsKey(begin_);
|
||
|
|
int sum = begin_ + length;
|
||
|
|
if (sum > all_len) {
|
||
|
|
int end_len = 1;
|
||
|
|
if (is_containKey) {
|
||
|
|
end_len = (int)replaceMap [begin_];
|
||
|
|
for (int k = begin_; k < end_len; k++) {
|
||
|
|
chars [k] = '*';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (end_len == 1) {
|
||
|
|
end_len = begin_ + end_len;
|
||
|
|
}
|
||
|
|
begin_ = end_len;
|
||
|
|
length = matchLength;
|
||
|
|
}
|
||
|
|
sum = begin_ + length;
|
||
|
|
|
||
|
|
if (sum > all_len)
|
||
|
|
return;
|
||
|
|
|
||
|
|
char c = chars [begin_];
|
||
|
|
bool is_exit_c = isExistChar(c);
|
||
|
|
if (is_exit_c) {
|
||
|
|
bool is_exist = isExistCharArrays(chars, begin_, length);
|
||
|
|
if (is_exist) {
|
||
|
|
int size = begin_ + length;
|
||
|
|
is_containKey = replaceMap.ContainsKey(begin_);
|
||
|
|
if (is_containKey) {
|
||
|
|
replaceMap [begin_] = size;
|
||
|
|
} else {
|
||
|
|
replaceMap.Add(begin_, size);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
filterCharArrays(chars, begin_, length + 1, replaceMap);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 文本是否包括非法关键字
|
||
|
|
* @param text
|
||
|
|
* @return
|
||
|
|
*/
|
||
|
|
public bool isUnlawful(string text)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrEmpty(text)) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
text = text.ToLower();
|
||
|
|
char[] chars = text.ToCharArray();
|
||
|
|
return isUnlawfulCharArrays(chars, 0, matchLength);
|
||
|
|
}
|
||
|
|
|
||
|
|
private bool isUnlawfulCharArrays(char[] chars, int begin_, int length)
|
||
|
|
{
|
||
|
|
int all_len = chars.Length;
|
||
|
|
int sum = begin_ + length;
|
||
|
|
if (sum > all_len) {
|
||
|
|
begin_++;
|
||
|
|
length = matchLength;
|
||
|
|
}
|
||
|
|
sum = begin_ + length;
|
||
|
|
|
||
|
|
if (sum > all_len)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
char c = chars [begin_];
|
||
|
|
bool is_exit_c = isExistChar(c);
|
||
|
|
if (is_exit_c) {
|
||
|
|
bool is_exist = isExistCharArrays(chars, begin_, length);
|
||
|
|
if (is_exist) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return isUnlawfulCharArrays(chars, begin_, length + 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|