当前位置:Gxlcms > PHP教程 > 留言板内容不文明词语过滤的问题

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

时间:2021-07-01 10:21:17 帮助过:5人阅读

如题。

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


回复讨论(解决方案)

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

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]);

这样就可以了

人气教程排行