96SEO 2026-02-19 10:42 16
辉用到命名功能所以这个过滤也只是一个实验性的功能我们将使用AC自动机来实现这是在我们把“csdn”这个词设置为屏蔽词后的效果

我们是从别的地方找的开源词典所以要做一下筛选首先我们要去重然后去除所有的标点符号空格和其他无关字符然后同时去掉长度为1的字符因为其会在AC自动机中表现的过于严格
//词典的路径这里是单独开了一个程序所以和后面项目里相关代码用到的路径不同
Words.end()){//去掉短字但这里对中文无效因为一个中文字长度大概率不为1if
(iswpunct(It1)||iswblank(It1)||iswspace(It1)){Word.erase(It1);It1--;}
AC自动机就是在字典树的基础上加入了类似于KMP的失配指针当匹配串在树上失配时会回溯到某个上一层的节点该节点的所有父节点即前缀和失配节点的所有父节点的后缀形成最大匹配使多模匹配的效率达到近似O(匹配串长度)
因为我们要将匹配到的敏感词替换成*所以相比于一般的自动机节点要在每个词的末尾记录这个词的长度同时因为不止26个字母所以也用红黑树替代了数组
public:FSensitiveWordFilterStruct()default;explicit
FSensitiveWordFilterStruct(const
wchar_tInputCharacter):Character(InputCharacter){};//字符wchar_t
Length{0};//子节点TMapwchar_t,std::shared_ptrFSensitiveWordFilterStructChildNode;//失配指针FSensitiveWordFilterStruct*
FSensitiveWordFilterStructSensitiveWordFilterRoot;
UAstromutateGameInstance::UAstromutateGameInstance()
{//加载词典LoadTXTFile(/Movies/Dict.txt);//实例化自动机根节点SensitiveWordFilterRootstd::make_sharedFSensitiveWordFilterStruct(FSensitiveWordFilterStruct());//将词典中的词添加到树上for(const
autoIt:*SensitiveWords){AddWordToSensitiveWordTree(It);}//建立失配指针InitializeSensitiveWordTree();
这里我们把词典作为txt文件放在Movies文件夹下因为该文件夹中的所有文件都会被原封不动的打包我们将所有敏感词存到一个TArray中
UAstromutateGameInstance::LoadTXTFile(const
Temp{FPaths::ProjectContentDir()Path};//实例化词典数组SensitiveWordsMakeSharedTArrayFString(TArrayFString());//加载所有词FFileHelper::LoadFileToStringArray(*SensitiveWords,*Temp);UE_LOG(LogTemp,Warning,TEXT(SensitiveWords
从根节点开始遍历模式串如果当前点没有当前字符对应的子节点就创建之然后无论有无都移动到该子节点
UAstromutateGameInstance::AddWordToSensitiveWordTree(const
{//获取根节点FSensitiveWordFilterStruct*
TempSensitiveWordFilterRoot.get();//遍历模式串中的每一个字符for(const
CurrentChar{It};//如果当前点没有对应的子节点就添加之if(!Temp-ChildNode.Contains(CurrentChar)){Temp-ChildNode.Add(CurrentChar,std::make_sharedFSensitiveWordFilterStruct(FSensitiveWordFilterStruct(CurrentChar)));}TempTemp-ChildNode[CurrentChar].get();}//将词的长度记录在词尾Temp-LengthInputString.Len();
因为失配指针指向的节点一定在当前点的上层所以我们进行bfs首先将根节点的所有直连的子节点的失配指针指向根节点因为这些点的上层节点只有根节点。
然后对于一个失配点如果其父节点的失配指针指向的点的子节点中有和该失配点相同的点则失配点的失配指针指向该点否则指向根节点
UAstromutateGameInstance::InitializeSensitiveWordTree()
{//bfs队列std::queuestd::shared_ptrFSensitiveWordFilterStructQueue;//将深度为1的点的失配指针指向根节点for(autoIt:SensitiveWordFilterRoot-ChildNode){It.Value-FailPointerSensitiveWordFilterRoot.get();Queue.push(std::make_sharedFSensitiveWordFilterStruct(*It.Value));}while(!Queue.empty()){std::shared_ptrFSensitiveWordFilterStruct
CurrentNodeQueue.front();Queue.pop();//遍历所有子节点for(autoIt:CurrentNode-ChildNode){//父节点的失配指针指向的节点是否含有匹配的子节点if(!CurrentNode-FailPointer-ChildNode.Contains(It.Key)){It.Value-FailPointerSensitiveWordFilterRoot.get();}else{It.Value-FailPointerCurrentNode-FailPointer-ChildNode[It.Key].get();}Queue.push(std::make_sharedFSensitiveWordFilterStruct(*It.Value));}}
首先我们将玩家输入的字符串使用字典中字符串同样的方法进行处理去除符号和空格全部转为小写然后遍历其每一个字符不匹配就按失配指针移动匹配就检查是否是词尾如果是的话根据记录的词的长度算出这个词的区间将这个居间内的所有字符替换成*该操作不会影响到后面的匹配最后将字符串还原成原来有符号和空格的格式并返回
UAstromutateGameInstance::ReplaceSensitiveWords(const
Result{};//对玩家输入的字符串进行处理for(const
autoIt:RawString){if(iswpunct(It)||iswblank(It)||iswspace(It))continue;if(isupper(It))Resulttowlower(It);elseResultIt;}FSensitiveWordFilterStruct*
Temp{SensitiveWordFilterRoot.get()};//遍历匹配串的每一个字符for(int
CurrentChar{Result[i]};//如果失配就一直回溯直到根节点while(!Temp-ChildNode.Contains(CurrentChar)Temp!SensitiveWordFilterRoot.get()){TempTemp-FailPointer;}//仍然适配就结束这个字符的搜索if(!Temp-ChildNode.Contains(CurrentChar)){TempSensitiveWordFilterRoot.get();continue;}//移动到匹配的节点TempTemp-ChildNode[CurrentChar].get();FSensitiveWordFilterStruct*
Temp2{Temp};//遍历匹配到的所有词while(Temp2!SensitiveWordFilterRoot.get()){if(Temp2-Length){//根据长度算出该词其实位置for(int
ji-Temp2-Length1;ji;j){Result[j]*;}}Temp2Temp2-FailPointer;}}//将处理完的字符串还原成输入的格式FString
CurrentIndex{0};for(autoIt:TrueResult){if(iswpunct(It)||iswblank(It)||iswspace(It))continue;if(iswupper(It)iswlower(Result[CurrentIndex])){continue;}ItResult[CurrentIndex];}return
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback