php过滤不文明的词,留言板内容不文明词语过滤的问题

这篇博客讨论了在PHP中如何实现敏感词过滤,包括使用数组和文本文件存储敏感词,通过循环和正则表达式进行内容检查。文章提到了在处理过程中遇到的问题,如误判和漏检,并分享了解决方案,例如使用strstr()函数提高效率和避免换行符影响。此外,还提及了直接替换敏感词为星号的和谐方法。
摘要由CSDN通过智能技术生成

如题。

现在不文明词语是个数组,在留言板内容后,我需要用这个不文明词语数组里面逐个查找留言板内容中是否有匹配的。如果有则提示。在纠结着怎么样才能实现这个不文明词语过滤的效果

回复讨论(解决方案)

首先得有一个脏词包(数据库,或者数组形式)。然后循环正则替换。

function filterWd($content){ $fn = "common/filterword.txt"; $fd = fopen($fn, "rb"); if(file_exists($fn)){ $fw = array(); while(!feof($fd)){ $fw[] = fgets($fd); } for($i = 0; $i < count($fw); $i++){ $srs = stripos($content, $fw[$i]); if($srs = false){ echo "error"; }else{ echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入"; break; } } }else{ echo null; }}filterWd("你妹的找死啊");

比如 filterword.txt 里面有 不文明、你妹、找死 三个词语 “echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";” 这行输出的永远是 不文明 这个单词啊,这个怎么判断?

12行的 if($srs = false){

改为 if($srs == false){

12行的 if($srs = false){

改为 if($srs == false){

嗯,我改过来了还是觉得不行。但是我后面改了一下要过滤的词语后就能找出来了,现在问题又来了,为什么有些词语明明是有的就是没检测出来。如

function filterWd($content){$fw = array("不文明", "去你的");for($i = 0; $i < count($fw); $i++){$srs = stripos($content, $fw[$i]);if($srs == false){echo "error 第" . $i . "次

";}else{echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";break;}}}filterWd("不文明啊去你的");输出:error 第0次您输入的内容包含不文明用语'去你的',请重新输入//为什么不首先检测到“不文明”呢?

你不是在找到第一个就不再找(break)了吗?

第一个 “不文明” 不等于 false 输出:您输入的内容包含不文明用语'去你的',请重新输入。然后再断开

不应该是这样的吗?怎么会跳到第二个“去你的”去断开

出现的次序是由你的字典顺序决定的

如果你用 trie 算法(精华区有)的话,才能按输入文字的次序检查

不是很理解 , 刚接触不久

你的算法是遍历字典,逐个查看字典字是否出现在正文中

也就是字典有多大,就要检查多少遍

而 trie 算法是:逐字扫描正文,检查由字组成的次是否出现在字典中

只需扫描一遍正文,就可找到所有存在的字典字

经你这么,有点似懂非懂。我换了个 strstr() 就解决了这个问题, strstr() 应该就是全文检索unction filterWd($content){$fw = array("天堂", "地狱", "找死", "你妹的", "不文明");for($i = 0; $i < count($fw); $i++){$srs = stristr($content, $fw[$i]);if($srs == false){echo "error";}else{echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";break;}}}filterWd("不文明啊去你的天堂找死");输出:您输入的内容包含不文明用语'天堂',请重新输入//不管我数组里面怎么打乱次序,数组中第一个 “天堂” 首先在正文中被检索到

如果只是用单个字符串去检索正文用 strpos() 效率应该会更快些

关键是我现在是数组去检索正文 还得判断从数组中取出的是不是匹配 这个有点难理解

if($srs === false){

echo "error 第" . $i . "次

";

}else{

echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";

break;

}

//楼主该好好看手册了。

if($srs === false){

echo "error 第" . $i . "次

";

}else{

echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";

break;

}

//楼主该好好看手册了。

有一个我真的不明白,读取文件得来的 存到数组里面

运行到这步

(在下面这行代码之前我运行过 echo $fw[0....9])都是有结果的)

$srs = stristr($content, $fw[$i]); //到这行就是 false 了

返回值永为 false ;

实在让人费解

用var_dump();分别输出一下两个值看看。

var_dump() 也度过了, 只要是过了 $srs = stristr($content, $fw[$i]); 输出的全都是 false

function filterWd($content){ $fw = array("天堂", "地狱", "找死", "你妹的", "不文明"); for($i = 0; $i < count($fw); $i++){ $srs = stristr($content, $fw[$i]); if($srs !== false){ echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入

"; //break; } } }filterWd("不文明啊去你的天堂找死");您输入的内容包含不文明用语'天堂',请重新输入

您输入的内容包含不文明用语'找死',请重新输入

您输入的内容包含不文明用语'不文明',请重新输入

之前写了个php替换敏感字符的类,有白名单和黑名单。

黑名单的会替换为*。

可以参考一下: http://blog.csdn.net/fdipzone/article/details/8486985

function filterWd($content){ $fw = array("天堂", "地狱", "找死", "你妹的", "不文明"); for($i = 0; $i < count($fw); $i++){ $srs = stristr($content, $fw[$i]); if($srs !== false){ echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入

"; //break; } } }filterWd("不文明啊去你的天堂找死");您输入的内容包含不文明用语'天堂',请重新输入

您输入的内容包含不文明用语'找死',请重新输入

您输入的内容包含不文明用语'不文明',请重新输入

我知道这样是可以。如果数组是读取文件得来的就不行

你读文件时没有去掉换行符$fn = "common/filterword.txt";$fd = fopen($fn, "rb");if(file_exists($fn)){ $fw = array(); while(!feof($fd)){ $fw[] = trim(fgets($fd)); }}print_r($fw);

干脆这样

$fn = "common/filterword.txt";$fw = file($fn, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);print_r($fw);

过滤的话...可不可以不提示直接和谐后发布?

echo str_replace($脏话数组, , $content);

还真的是这样,去掉 空格 换行符 就可以了

$fw[] = trim(fgets($fn));

然后再检索 strstr($content,$fw[$i]);

这样就可以了

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值