PHP实现的敏感词过滤方法

PHP实现的敏感词过滤方法PHP 实现的敏感词过滤方法 有好的编码和好的实现方法 可以发出来一起交流一下 以下是一份过滤敏感词的编码 个人博客 Harvey 的个人博客 一 敏感词过滤方案一 todo 敏感词过滤 返回结果 paramarray list 定义敏感词一维数组 paramstring string 要过滤的内容

PHP实现的敏感词过滤方法,有好的编码和好的实现方法,可以发出来一起交流一下。以下是一份过滤敏感词的编码

???个人博客:Harvey的个人博客 ???

一.敏感词过滤方案一

 / * @todo敏感词过滤,返回结果 * @paramarray $list 定义敏感词一维数组 * @paramstring $string 要过滤的内容 * @returnstring $log 处理结果 */ function sensitive($list, $string) { $count = 0; //违规词的个数 $sensitiveWord = ''; //违规词 $stringAfter = $string; //替换后的内容 $pattern = "/" . implode("|", $list) . "/i"; //定义正则表达式 if (preg_match_all($pattern, $string, $matches)) { //匹配到了结果 $patternList = $matches[0]; //匹配到的数组 $count = count($patternList); $sensitiveWord = implode(',', $patternList); //敏感词数组转字符串 $replaceArray = array_combine($patternList, array_fill(0, count($patternList), '*')); //把匹配到的数组进行合并,替换使用 $stringAfter = strtr($string, $replaceArray); //结果替换 } $log = "原句为 [ {$string} ]"; if ($count == 0) { $log .= "暂未匹配到敏感词!"; } else { $log .= "匹配到 [ {$count} ]个敏感词:[ {$sensitiveWord} ] " . "替换后为:[ {$stringAfter} ]"; } return $log; } //调用方法 function testAction() { $string = 'likeyou小白喜欢小黑爱着的大黄'; //要过滤的内容 $list = ['小明', '小红', '大白', '小白', '小黑', 'me', 'you']; //定义敏感词数组 $result = $this->sensitive($list, $string); echo($result); //打印结果: /* 原句为 [ likeyou小白喜欢小黑爱着的大黄 ] 匹配到 [ 3 ]个敏感词:[ you,小白,小黑 ] 替换后为:[ like喜欢*爱着的大黄 ] */ }

二.敏感词过滤方案二

在网上查了下敏感词过滤方案,找到了一种名为DFA的算法,即Deterministic Finite Automaton算法,翻译成中文就是确定有穷自动机算法。它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测,所以效率比方案一高不少。

假设我们有以下5个敏感词需要检测:傻逼、傻子、傻大个、坏蛋、坏人。那么我们可以先把敏感词中有相同前缀的词组合成一个树形结构,不同前缀的词分属不同树形分支,在Java中,我们可以用HashMap来存储上述的树形结构,还是以上述敏感词为例,我们把每个敏感词字符串拆散成字符,再存储到HashMap中。

三.敏感词过滤方案三

方案二在性能上已经可以满足需求了,但是却很容易被激活成功教程,比如说,我在待检测文本中的敏感词中间加个空格,就可以成功绕过了。要解决这个问题也不难,有一个简单的方法是初始化一个无效字符库,比如:空格、*、#、@等字符,然后在检测文本前,先将待检测文本中的无效字符去除,这样的话被检测字符就不存在这些无效字符了,因此还是可以继续用方案二进行过滤。只要被检测文本不要太长,那么我们只要在方案二的基础上再多扫描一次被检测文本去除无效字符就行了,这个性能损耗也还是可以接受的。

如果敏感词是英文,则还要考虑大小写的问题。有一个比较简单的解决方案是在初始化敏感词时,将敏感词都以小写形式存储。同时,在检测文本时,也统一将待检测文本转化为小写,这样就能解决大小写的问题了。

比较棘手的是中文跟拼音混合的情况,比如“傻逼”这个敏感词,可以通过“sha逼”这种中文跟拼音混合的方式轻松绕过,对于这种情况我目前还没想到比较好的解决方案,有想法的读者可以在文末留言。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211086.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:14
下一篇 2026年3月18日 下午11:15


相关推荐

  • 应用层,驱动层,硬件层_windows组件向导在哪里

    应用层,驱动层,硬件层_windows组件向导在哪里驱动层与应用层通信是通过DeviceIoControl,首先驱动层要实现:pDriverObject->DriverUnload=MyDriverUnload;pDriverObject->MajorFunction[IRP_MJ_CREATE]=MyCreate;pDriverObject->MajorFunction[IRP_MJ_CLOSE]=MyClose;

    2025年9月26日
    10
  • 我用AI干掉了自己的工作,然后发现了新机会

    我用AI干掉了自己的工作,然后发现了新机会

    2026年3月15日
    1
  • 判断一个字符串是否是回文字符串「建议收藏」

    判断一个字符串是否是回文字符串「建议收藏」#include<string.h>#include<stdio.h>main(){ chara[40];//定义一个存放待判断的字符数组 inti=0,len; printf("pleaseinputyourstring:(length<40):"); gets(a);//逐个读取a数组中的字符 len=strlen(a);//计…

    2022年5月10日
    43
  • 谷歌地图离线地图开发教程视频_谷歌地图离线

    谷歌地图离线地图开发教程视频_谷歌地图离线谷歌离线地图开发主要有两部分组成:1、获取离线地图数据;因为离线地图一般都是局域网,所以需要离线地图数据放在内网中使用;2、离线地图服务器搭建以及二次开发接口提供,离线地图是一种服务,就像我们Apache提供的WEB服务器一样,他是一种准们的地图服务:提供了包括WEB服务、TMS服务、WMTS服务等等。离线地图数据的获取:可以通过【大地图下载器】下载到。下面将一…

    2026年2月2日
    3
  • 各代iphone尺寸_iphone 各型号设备的屏幕尺寸「建议收藏」

    各代iphone尺寸_iphone 各型号设备的屏幕尺寸「建议收藏」4320×4805320×5686375×6676plus414×7366s375×6676splus414×736相关链接:http://blog.csdn.net/phunxm/article/details/421749371.iPhone尺寸规格设备iPhone宽Width高Height对角线Diagonal逻辑分辨率(point)ScaleFactor设备分辨率(pixel)PPI3G…

    2022年5月14日
    43
  • c语言负数转为八进制,负数二进制怎么转成十进制

    c语言负数转为八进制,负数二进制怎么转成十进制本文收集整理关于负数二进制怎么转成十进制的相关议题 使用内容导航快速到达 内容导航 Q1 十进制负数转换成二进制数的方法 计算机中一般用补码来表示 若对于补码有不清楚之处请参考 http baike baidu com view 377340 htm 负数转换为二进制 就是将其相反数 正数 的补码的每一位变反 1 变 0 0 变 1 最后将变完了的数值加 1 就完成了负数的补码运算 这样就变成了二进制

    2026年3月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号