C++ 敏感字符过滤

WordNode.h

#ifndef __TOOLS_WORDNODE_H_INCLUDE__

#define __TOOLS_WORDNODE_H_INCLUDE__

#include <map>

class CWordNode

{

typedef std::map<std::string, CWordNode*> 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 <list>

#include "WordNode.h"

class CWordsFilter

{

typedef std::map<std::string, CWordNode*> umap;

private:

std::list<std::string> m_lsAllSensitiveWords; // 所有敏感词列表

CWordNode*             m_rootWordNode;

bool                   m_bIsInit;

public:

CWordsFilter();

~CWordsFilter();

static CWordsFilter&  GetInstance(); // 获取共享实例

void                   InitSensitiveWords(std::string strWord);                        // 初始化敏感词集

void                   InitSensitiveWords(std::list<std::string> 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 <iostream>

#include <sstream>

#include <fstream>

#include <cmath>

#include "WordsFilter.h"

int nStep = 2;

typedef std::vector<std::string> 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<std::string> lsAllSensitiveWords;

Tokens::iterator Ite = token.begin();

while (Ite != token.end())

{

lsAllSensitiveWords.push_back(*Ite);

++Ite;

}

InitSensitiveWords(lsAllSensitiveWords);

}

void CWordsFilter::InitSensitiveWords(std::list<std::string> lsAllSensitiveWords)

{

std::cout << "start init sensitive words" << std::endl;

this->m_lsAllSensitiveWords.clear();

this->m_lsAllSensitiveWords = lsAllSensitiveWords;

BuildWordTree();

this->m_bIsInit = true;

}

std::string CWordsFilter::FilterSensitiveWords(const std::string& strContent)

{

if (!this->m_bIsInit || NULL == this->m_rootWordNode)

{

std::cout << "the sensitive words is not init" << std::endl;

return "";

}

CWordNode* pNode = this->m_rootWordNode;

std::string strBuffer = "";

std::list<std::string> lsBad;

int a = 0;

while ( a < strContent.size() )

{

std::string strContentTmp = strContent.substr(a, strContent.size());

nStep = GetFirstBytes(strContentTmp);

std::string strTmp = "";

if (nStep <= strContentTmp.size())

{

strTmp = strContentTmp.substr(0, nStep);

}

pNode = FindNode(pNode, strTmp);

if (pNode == NULL)

{

pNode = this->m_rootWordNode;

int nSize = 0;

std::list<std::string>::iterator Ite = lsBad.begin();

while (Ite != lsBad.end())

{

nSize += (*Ite).size();

++Ite;

}

if (lsBad.size() > 0)

{

lsBad.clear();

}

a = a - nSize;

if (a < 0)

{

a = 0;

}

std::string strContentTmp = strContent.substr(a, strContent.size());

nStep = GetFirstBytes(strContentTmp);

strTmp = "";

if (nStep <= strContentTmp.size())

{

strTmp = strContentTmp.substr(0, nStep);

}

strBuffer.append(strTmp);

}

else if (pNode->m_nEndTag == 1)

{

lsBad.push_back(strTmp);

for (int nIndex = 0; nIndex < lsBad.size(); ++nIndex)

{

strBuffer.append("*");

}

pNode = this->m_rootWordNode;

lsBad.clear();

}

else

{

lsBad.push_back(strTmp);

if (a == strContent.size() - nStep)

{

std::list<std::string>::const_iterator cIte = lsBad.begin();

while (cIte != lsBad.end())

{

strBuffer.append(*cIte);

++cIte;

}

}

}

strContentTmp = strContentTmp.substr(nStep, strContentTmp.size());

a += nStep;

}

return strBuffer;

}

void CWordsFilter::BuildWordTree()

{

if ( this->m_rootWordNode == NULL )

{

this->m_rootWordNode = new CWordNode("R");

if (NULL == this->m_rootWordNode)

{

return;

}

}

this->m_rootWordNode->Reset("R");

std::list<std::string>::const_iterator cIte = this->m_lsAllSensitiveWords.begin();

while (cIte != this->m_lsAllSensitiveWords.end())

{

std::string strTmp = (*cIte);

if (strTmp.size() > 0)

{

InsertNode(this->m_rootWordNode, strTmp, 0);

}

++cIte;

}

}

void CWordsFilter::InsertNode(CWordNode* pNode, const std::string& strContent, int nIndex)

{

if (NULL == pNode)

{

return;

}

nStep = GetFirstBytes(strContent);

std::string strTmp = "";

if (nStep <= strContent.size())

{

strContent.substr(0, nStep);

}

CWordNode* pN = FindNode(pNode, strTmp);

if (NULL == pN)

{

pN = new CWordNode(strTmp);

if (NULL == pN)

{

return;

}

pNode->m_mapWordNodes[strTmp] = pN;

}

if (nIndex == strContent.size() - nStep)

{

pN->m_nEndTag = 1;

}

strTmp = strContent.substr(nStep, strContent.size());

if (strTmp.size() > 0)

{

InsertNode(pN, strTmp, 0);

}

}

CWordNode* CWordsFilter::FindNode(CWordNode* pNode, const std::string& word)

{

if ( NULL == pNode )

{

return NULL;

}

umap::iterator Ite = pNode->m_mapWordNodes.find(word);

if (Ite != pNode->m_mapWordNodes.end())

{

return Ite->second;

}

return NULL;

}

CWordsFilter& CWordsFilter::GetInstance()

{

static CWordsFilter inst;

return inst;

}

时间: 2024-11-03 03:24:37

C++ 敏感字符过滤的相关文章

java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

好记性不如烂笔头31-java应用中的敏感词过滤实现(3)

敏感词过滤,国内混的同学看到这个都会会心一笑.其实敏感词过滤,在几乎所有国家都是存在的,只是表现的形式并不完全相同而已. 既然这个功能叫做关键词过滤,那么做在过滤器中,应该是一个好主意. 1.JAVA实现利用过滤器实现敏感信息过滤 过滤器的JAVA代码: package com.filter; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.

过滤敏感字符

原文:过滤敏感字符 源代码下载地址:http://www.zuidaima.com/share/1550463636458496.htm 有疑问请联系我.

转:Java实现敏感词过滤

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

Java实现敏感词过滤

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

Java实现敏感词过滤(转)

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

敏感词过滤的算法原理之DFA算法

参考文档 http://blog.csdn.net/chenssy/article/details/26961957 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正

转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的技术挑战 作者 陈康贤 发布于 2016年1月28日 | 2 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单 前言:一直以来双十一都是以交易为重心,今年当然也是如此,但是这并不妨碍万能的淘宝将双十一打造的让用户更欢乐.体验更丰富.玩法更多样.内容更有趣

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类   =========================== ?Copyright 蕃薯耀 2017年9月25日 http://www.cnblogs.com/fanshuyao/ 一.问题描述 很多对外网站的某些内容都需要过滤敏感词,避免政治与色@情上的问题. 二.解决方案 使用词库进行匹配过滤成 * (星号) Java 敏感词工具类及敏感词词库见附件. 1.下载后,有几个类,主要为WordFilter 这个工具类,使用方法如下