解决方案 »

  1.   

    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]',请重新输入";”  这行输出的永远是  不文明   这个单词啊,这个怎么判断?
      

  2.   

    12行的 if($srs = false){
    改为 if($srs == false){
      

  3.   


    嗯,我改过来了还是觉得不行。但是我后面改了一下要过滤的词语后就能找出来了,现在问题又来了,为什么有些词语明明是有的就是没检测出来。如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次
    您输入的内容包含不文明用语'去你的',请重新输入
    //为什么不首先检测到“不文明”呢?
      

  4.   

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

  5.   

    第一个 “不文明” 不等于 false  输出:您输入的内容包含不文明用语'去你的',请重新输入。然后再断开
    不应该是这样的吗?怎么会跳到第二个“去你的”去断开
      

  6.   

    出现的次序是由你的字典顺序决定的
    如果你用 trie 算法(精华区有)的话,才能按输入文字的次序检查
      

  7.   

    你的算法是遍历字典,逐个查看字典字是否出现在正文中
    也就是字典有多大,就要检查多少遍而 trie 算法是:逐字扫描正文,检查由字组成的次是否出现在字典中
    只需扫描一遍正文,就可找到所有存在的字典字
      

  8.   

    经你这么,有点似懂非懂。我换了个 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("不文明啊去你的天堂找死");输出:您输入的内容包含不文明用语'天堂',请重新输入//不管我数组里面怎么打乱次序,数组中第一个 “天堂” 首先在正文中被检索到
      

  9.   

    如果只是用单个字符串去检索正文用 strpos() 效率应该会更快些  关键是我现在是数组去检索正文   还得判断从数组中取出的是不是匹配   这个有点难理解
      

  10.   

    if($srs === false){
                    echo "error 第" . $i . "次<br />";
                }else{
                    echo "您输入的内容包含不文明用语'$fw[$i]',请重新输入";
                    break;
                }//楼主该好好看手册了。
      

  11.   


    有一个我真的不明白,读取文件得来的 存到数组里面
    运行到这步   
               (在下面这行代码之前我运行过 echo $fw[0....9])都是有结果的)
                $srs = stristr($content, $fw[$i]);    //到这行就是 false  了返回值永为 false ;实在让人费解
      

  12.   

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

  13.   

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

  14.   

    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("不文明啊去你的天堂找死");您输入的内容包含不文明用语'天堂',请重新输入
    您输入的内容包含不文明用语'找死',请重新输入
    您输入的内容包含不文明用语'不文明',请重新输入
      

  15.   

    之前写了个php替换敏感字符的类,有白名单和黑名单。
    黑名单的会替换为*。可以参考一下:http://blog.csdn.net/fdipzone/article/details/8486985
      

  16.   

    你读文件时没有去掉换行符
    $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);
      

  17.   

    过滤的话...可不可以不提示直接和谐后发布?echo str_replace($脏话数组, , $content);
      

  18.   


    还真的是这样,去掉  空格  换行符   就可以了 $fw[] = trim(fgets($fn));  然后再检索   strstr($content,$fw[$i]);   这样就可以了