留言板内容不文明词语过滤的问题 词语过滤 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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){ 嗯,我改过来了还是觉得不行。但是我后面改了一下要过滤的词语后就能找出来了,现在问题又来了,为什么有些词语明明是有的就是没检测出来。如function filterWd($content){ $fw = array("不文明", "去你的"); for($i = 0; $i < count($fw); $i++){ $srs = stripos($content, $fw[$i]); if($srs == false){ echo "error 第" . $i . "次<br />"; }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 . "次<br />"; }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]',请重新输入<br>"; //break; } } }filterWd("不文明啊去你的天堂找死");您输入的内容包含不文明用语'天堂',请重新输入您输入的内容包含不文明用语'找死',请重新输入您输入的内容包含不文明用语'不文明',请重新输入 之前写了个php替换敏感字符的类,有白名单和黑名单。黑名单的会替换为*。可以参考一下:http://blog.csdn.net/fdipzone/article/details/8486985 你读文件时没有去掉换行符$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]); 这样就可以了 生成PDF “双引号变成$quot了 PHP的功能已经实现,却总是报错 想开发一个门户,不知道用什么适合?能二次开发的,求高手指点。 onkeyDown事件问题 找人做网站:实现在网页中聊天,类似留言板,但是可以即时看到对方在文本框里面打字的过程。 手机拍的图片,无法用php图像处理库打开 php session购物车问题 PHP怎样生成CHM文件 关于php的几个问题! 在php中,自动换行如何表示? 自动消息提醒功能 招PHPer 浦东软件园靠近金科路地铁站
$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]',请重新输入";” 这行输出的永远是 不文明 这个单词啊,这个怎么判断?
改为 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 . "次<br />";
}else{
echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";
break;
}
}
}filterWd("不文明啊去你的");输出:
error 第0次
您输入的内容包含不文明用语'去你的',请重新输入
//为什么不首先检测到“不文明”呢?
不应该是这样的吗?怎么会跳到第二个“去你的”去断开
如果你用 trie 算法(精华区有)的话,才能按输入文字的次序检查
也就是字典有多大,就要检查多少遍而 trie 算法是:逐字扫描正文,检查由字组成的次是否出现在字典中
只需扫描一遍正文,就可找到所有存在的字典字
$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("不文明啊去你的天堂找死");输出:您输入的内容包含不文明用语'天堂',请重新输入//不管我数组里面怎么打乱次序,数组中第一个 “天堂” 首先在正文中被检索到
echo "error 第" . $i . "次<br />";
}else{
echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";
break;
}//楼主该好好看手册了。
有一个我真的不明白,读取文件得来的 存到数组里面
运行到这步
(在下面这行代码之前我运行过 echo $fw[0....9])都是有结果的)
$srs = stristr($content, $fw[$i]); //到这行就是 false 了返回值永为 false ;实在让人费解
$fw = array("天堂", "地狱", "找死", "你妹的", "不文明");
for($i = 0; $i < count($fw); $i++){
$srs = stristr($content, $fw[$i]);
if($srs !== false){
echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入<br>";
//break;
}
}
}
filterWd("不文明啊去你的天堂找死");您输入的内容包含不文明用语'天堂',请重新输入
您输入的内容包含不文明用语'找死',请重新输入
您输入的内容包含不文明用语'不文明',请重新输入
黑名单的会替换为*。可以参考一下:http://blog.csdn.net/fdipzone/article/details/8486985
$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);
还真的是这样,去掉 空格 换行符 就可以了 $fw[] = trim(fgets($fn)); 然后再检索 strstr($content,$fw[$i]); 这样就可以了