设为首页
加入收藏
首页
C语言
C++
面试
Linux
函数
Windows
数据库
下载
搜索
我要投稿
全站搜索
文章
图片
软件
视频
商品
FLASH
产品
高级搜索
当前位置:
首页
->
基础
->
c++编程基础
TOP
C++ 敏感字符过滤(一)
2015-11-21 01:02:27
来源:
作者: 【
大
中
小
】 浏览:
4
次
Tags:
敏感
字符
过滤
WordNode.h
#ifndef __TOOLS_WORDNODE_H_INCLUDE__
#define __TOOLS_WORDNODE_H_INCLUDE__
#include
class CWordNode
{
typedef std::map
umap;
public:
CWordNode(const std::string& word) { Reset(word); }
~CWordNode()
{
umap::iterator Ite = this->m_mapWordNodes.begin();
while (Ite != this->m_mapWordNodes.end())
{
CWordNode* pTmp = Ite->second;
delete pTmp;
pTmp = NULL;
++Ite;
}
this->m_mapWordNodes.clear();
this->m_nEndTag = 0;
}
void Reset(const std::string& word)
{
this->m_cWord = word;
this->m_nEndTag = 0;
this->m_mapWordNodes.clear();
}
public:
std::string m_cWord;
int m_nEndTag;
umap m_mapWordNodes;
};
#endif // __TOOLS_WORDNODE_H_INCLUDE__
WordsFilter.h
#ifndef __TOOLS_WORDSFILTER_H_INCLUDE__
#define __TOOLS_WORDSFILTER_H_INCLUDE__
#include
#include "WordNode.h"
class CWordsFilter
{
typedef std::map
umap;
private:
std::list
m_lsAllSensitiveWords; // 所有敏感词列表
CWordNode* m_rootWordNode;
bool m_bIsInit;
public:
CWordsFilter();
~CWordsFilter();
static CWordsFilter& GetInstance(); // 获取共享实例
void InitSensitiveWords(std::string strWord); // 初始化敏感词集
void InitSensitiveWords(std::list
lsAllSensitiveWords); // 初始化敏感词集
std::string FilterSensitiveWords(const std::string& strContent); // 过滤敏感词
private:
void BuildWordTree(); // 构建敏感词树
void InsertNode(CWordNode* pNode, const std::string& strContent, int nIndex);
CWordNode* FindNode(CWordNode* pNode, const std::string& word);
int GetFirstBytes(const std::string& str); // 获取字符串中的第一个字符字节长度
};
#endif // __TOOLS_WORDSFILTER_H_INCLUDE__
WordsFilter.cpp
#include
#include
#include
#include
#include "WordsFilter.h"
int nStep = 2;
typedef std::vector
Tokens;
Tokens StrSplit(const std::string &src, const std::string &sep)
{
Tokens r;
std::string s;
for (std::string::const_iterator i = src.begin(); i != src.end(); i++)
{
if (sep.find((*i)) != std::string::npos)
{
if (s.length())
{
r.push_back(s);
}
s = "";
}
else
{
s += (*i);
}
}
if (s.length())
{
r.push_back(s);
}
return r;
};
int CWordsFilter::GetFirstBytes(const std::string& str)
{
for (int i = 0; i < (int)str.size(); ++i)
{
unsigned char chr = (unsigned char)str.at(i);
// 如果是该字节是 0XXX XXXX 样式,说明其是一个英文文字,占1字节
if ((chr >> 7) == 0)
{
return 1;
}
// 如果该字节是 1111 110X 样式,说明其是一个文字的头,且该文字占6字节
else if ((chr >> 1) == 126)
{
return 6;
}
// 如果该字节是 1111 10XX 样式,说明其是一个文字的头,且该文字占5字节
else if ((chr >> 2) == 62)
{
return 5;
}
// 如果该字节是 1111 0XXX 样式,说明其是一个文字的头,且该文字占4字节
else if ((chr >> 3) == 30)
{
return 4;
}
// 如果该字节是 1110 XXXX 样式,说明其是一个文字的头,且该文字占3字节
else if ((chr >> 4) == 14)
{
return 3;
}
// 如果该字节是 110X XXXX 样式,说明其是一个文字的头,且该文字占2字节
else if ((chr >> 5) == 6)
{
return 2;
}
else
{
continue;
}
}
return 1;
}
CWordsFilter::CWordsFilter():
m_bIsInit(false),
m_rootWordNode(NULL)
{
m_lsAllSensitiveWords.clear();
}
CWordsFilter::~CWordsFilter()
{
this->m_lsAllSensitiveWords.clear();
delete this->m_rootWordNode;
this->m_rootWordNode = NULL;
}
void CWordsFilter::InitSensitiveWords(std::string strWord)
{
Tokens token = StrSplit(strWord, ",");
std::list
lsAllSensitiveWords;
Tokens::iterator Ite = token.begin();
while (Ite != token.end())
{
lsAllSensitiveWords.push_back(*Ite);
++Ite;
}
InitSensitiveWords(lsAllSensitiveWords);
}
void CWordsFilter::InitSensitiveWords(std::lis
首页
上一页
1
2
下一页
尾页
1
/2/2
【
大
中
小
】【
打印
】
【
繁体
】【
投稿
】【
收藏
】 【
推荐
】【
举报
】【
评论
】 【
关闭
】 【
返回顶部
】
分享到:
上一篇
:
POJ 1028 Web Navigation
下一篇
:
BZOJ 4025 二分图 分治+并查集
评论
帐 号:
密码:
(
新用户注册
)
验 证 码:
表 情:
内 容:
Copyright@https://www.cppentry.com all rights reserved
粤ICP备13067022号-3
Powered by
qibosoft V7.0
Code © 2003-11
qibosoft