一、panduan.php
<?php/**
 * 判断文本中是否存在关键词
 */
function filter_text($text, $badstring){
$filter = explode('|', $badstring);
foreach ($filter as $key) {
if(strpos($text, $key) !== false){
return true;
}
}
return false;
}?>二、filter.php
<?php
$badstring="拦我|此内容|不允许";
?>三、index.php
<?php
require_once("panduan.php");
require_once("filter.php");
$biaoti="如果包含此内容就不能通过!";
if(filter_text($biaoti, $badstring)){
echo "对不起,你提示的内容包含“$*****”文字不能表,请删除“此内容”文字后再提交!";
exit();
}
?>以上代码能正确拦截事先设置好的关键词,但怎么写才能提示是哪个关键词非法的?如果取得引号中的内容:“$*****”?请高手帮忙,谢谢!

解决方案 »

  1.   

    在这里修改成
     if(strpos($text, $key) !== false){
    return $key;
    }这里
    if(filter_text($biaoti, $badstring)){
    echo "对不起,你提示的内容包含“$*****”文字不能表,请删除“此内容”文字后再提交!";
    exit();
    }修改成$badstr=filter_text($biaoti, $badstring);if($badstr){
    echo "对不起,你提示的内容包含“.$badstr.”文字不能表,请删除“此内容”文字后再提交!";
    exit();
    }大约如此.
      

  2.   

    php应该有一个函数吧,记得以前做过。
      

  3.   

    $text = '拦我';
    $badstring = "/拦我|此内容|不允许/";
    if (preg_match($badstring, $text, $matchs)){
    echo $matchs[0]; //var_dump($matchs);
    }
    直接这样岂不快哉.
      

  4.   

    关于二者的效率测试代码:
    $start = microtime(true);
    $text = '拦我';
    $badstring = "/拦我|此内容|不允许/";
    $count = 0;
    for($i = 0; $i < 1000000; $i++) :
    if (preg_match($badstring, $text, $matchs)){
    $count += 1;
    }
    endfor;
    $end = microtime(true);
    printf ("Complete Num: %d Total Time: %f sec (Using preg_match())", $count ,$end - $start);
    结果:Complete Num: 1000000 Total Time: 1.950609 sec (Using preg_match())$start = microtime(true);
    $text = '拦我';
    $badstring = "/拦我|此内容|不允许/";
    $count = 0;
    for($i = 0; $i < 1000000; $i++) :
    if (strpos($badstring, $text)){
    $count += 1;
    }
    endfor;
    $end = microtime(true);
    printf ("Complete Num: %d Total Time: %f sec (Using preg_match())", $count ,$end - $start);
    结果:Complete Num: 1000000 Total Time: 0.383920 sec (Using preg_match())
    结论:strpos 比 preg_math 要快很多!由此延伸结论,能用字符串处理函数解决的问题,尽量不要用正则!
      

  5.   

    csdn不能编辑回复,这个听尴尬的。点了编辑就说我没得权限。
      

  6.   

    当然要用preg_match,而不用strpos或其它,以解决用户用符号(如空格、&nbsp;等)间隔关键词。
    首先把禁用词存在badword.txt中,每一词用换行符隔开//过滤词汇
    function filter_badwords($text) {
      if ($badwords = @file('badword.txt')) {
        foreach ($badwords as $badword) {
      $badword = trim($badword);
      if ($badword != '') {
            $badword = preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0([^0-9a-z\x80-\xff]|(&[#a-z0-9]+;)| )*', $badword);
            $badword = preg_replace('/\(\[\^0-9a-z\\\x80-\\\xff\]\|\(&\[#a-z0-9\]\+;\)\| \)\*$/i', '', $badword);
            $badword = preg_replace('/^\(\[\^0-9a-z\\\x80-\\\xff\]\|\(\&\[\#a-z0-9\]\+\;\)\| \)\*/i', '', $badword);
            if (preg_match('/'.$badword.'/i', $text, $matches))
              die('提交被拒绝!有禁用词汇“'.preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0<span style="color:#FFFFFF;display:none;">禁</span>', $matches[0]).'”。请返回检查。');
            unset($matches);
          }
        }
      }
    }
      

  7.   

    当然要用preg_match,而不用strpos或其它,以解决用户用符号(如空格、&nbsp;等)间隔关键词。
    首先把禁用词存在badword.txt中,每一词用换行符隔开//过滤词汇
    function filter_badwords($text) {
      if ($badwords = @file('badword.txt')) {
        foreach ($badwords as $badword) {
      $badword = trim($badword);
      if ($badword != '') {
            $badword = preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0([^0-9a-z\x80-\xff]|(&[#a-z0-9]+;)| )*', $badword);
            $badword = preg_replace('/\(\[\^0-9a-z\\\x80-\\\xff\]\|\(&\[#a-z0-9\]\+;\)\| \)\*$/i', '', $badword);
            $badword = preg_replace('/^\(\[\^0-9a-z\\\x80-\\\xff\]\|\(\&\[\#a-z0-9\]\+\;\)\| \)\*/i', '', $badword);
            if (preg_match('/'.$badword.'/i', $text, $matches))
              die('提交被拒绝!有禁用词汇“'.preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0<span style="color:#FFFFFF;display:none;">禁</span>', $matches[0]).'”。请返回检查。');
            unset($matches);
          }
        }
      }
    }