2012-07-18 89 views
1

我试图集成PHP的坏词过滤 输入通过$ _REQUEST采取[“qtitle”]和$ _REQUEST [“问题”] 但我没有这样做脏话过滤器集成

$USERID = intval($_SESSION['USERID']); 

if ($USERID > 0) 
{ 
$sess_ver = intval($_SESSION[VERIFIED]); 
$verify_asker = intval($config['verify_asker']); 
if($verify_asker == "1" && $sess_ver == "0") 
{ 
    $error = $lang['225']; 
    $theme = "error.tpl"; 
} 
else 
{ 
    $theme = "ask.tpl"; 
    STemplate::assign('qtitle',htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8")); 
    STemplate::assign('question',htmlentities(strip_tags($_REQUEST['question']), ENT_COMPAT, "UTF-8")); 
    if($_REQUEST['subform'] != "") 
    { 
     $qtitle = htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8"); 
     $question = htmlentities(strip_tags($_REQUEST['question']), ENT_COMPAT, "UTF-8"); 
     $category = intval($_REQUEST['category']); 


     if($qtitle == "") 
     { 
      $error = $lang['3']; 
     } 
     elseif($category <= "0") 
     { 
      $error = $lang['4']; 
     } 
     else 
     { 
      if($config['approve_stories'] == "1") 
      { 
       $addtosql = ", active='0'"; 
      } 
      $query="INSERT INTO posts SET USERID='".mysql_real_escape_string($USERID)."', title='".mysql_real_escape_string($qtitle)."',question='".mysql_real_escape_string($question)."', tags='".mysql_real_escape_string($qtitle)."', category='".mysql_real_escape_string($category)."', time_added='".time()."', date_added='".date("Y-m-d")."' $addtosql"; 
      $result=$conn->execute($query); 
      $userid = mysql_insert_id(); 
      $message = $lang['5']; 
     } 
    } 
} 
} 

else 
{ 
$question = htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8"); 
$redirect = base64_encode($thebaseurl."/ask?qtitle=".$question); 
header("Location:$config[baseurl]/login?redirect=$redirect");exit; 
} 

我想下面的代码,但是这个代码替换每一个字(不包括在阵列中)

FUNCTION BadWordFilter(&$text, $replace){ 

$bads = ARRAY (
    ARRAY("butt","b***"), 
    ARRAY("poop","p***"), 
    ARRAY("crap","c***") 
); 

    IF($replace==1) {          //we are replacing 
    $remember = $text; 

    FOR($i=0;$i<sizeof($bads);$i++) {    //go through each bad word 
     $text = EREGI_REPLACE($bads[$i][0],$bads[$i][1],$text); //replace it 
    } 

    IF($remember!=$text) RETURN 1;      //if there are any changes, return 1 

} ELSE {             //we are just checking 

    FOR($i=0;$i<sizeof($bads);$i++) {    //go through each bad word 
     IF(EREGI($bads[$i][0],$text)) RETURN 1; //if we find any, return 1 
    }  
} 
} 
$qtitle = BadWordFilter($wordsToFilter,0); 
$qtitle = BadWordFilter($wordsToFilter,1); 

我是缺少在这里?

+2

*(TIP)*谷歌“clbuttic”。然后放弃努力想出一个字过滤器。 – Gordon 2012-07-18 14:04:10

+0

嗯,我懒得看完整个代码,但是我在第一眼看到的就是说你最好重写你的脚本。例如,'eregi'已弃用。顺便说一句,为什么你使用关键字大写? – Leri 2012-07-18 14:05:39

+1

通常,FULL_CAPS为常量保留,PascalCase为类,camelCase为变量和函数。公约是一个敏感的话题,但是在这里左右都有公认的规则。 – Dan 2012-07-18 14:06:41

回答

0

我@Gordon同意这是重新发明轮子,但如果你真的想这样做,这里有一个更好的开始:

function badWordFilter(&$text, $replace) 
{ 
    $patterns = array(
     '/butt/i', 
     '/poop/i', 
     '/crap/i' 
    ); 

    $replaces = array(
     'b***', 
     'p***', 
     'c***' 
    ); 

    $count = 0; 
    if($replace){ 
     $text = preg_replace($patterns, $replaces, $text, -1, $count); 
    } else { 
     foreach($patterns as $pattern){ 
      $count = preg_match($pattern, $text); 
      if($count > 0){ 
       break; 
      } 
     } 
    } 

    return $count; 
} 

有很多固有的问题,虽然。例如,运行上的文字How do you like my buttons?过滤器...你会拥有How do you like my b***ons?

+0

我可以指定一个替代品,而不是替换为同一个替代品吗? – user1528878 2012-07-18 20:08:45

+0

我也可以用.txt文件替换这个ARRAY,这样我就可以把所有坏字都放到txt文件中 – user1528878 2012-07-18 20:24:49

+0

如果你想用一个字符串替换所有的匹配,你可以把'$ replaces'数组改为一个字符串:'$ replaces ='****';'...如果你想从文本文件中加载坏词,你可以,但你必须让它们进入preg模式,以便它们用' preg_replace' ... – keithhatfield 2012-07-18 20:42:57

0

我认为你应该使用这种功能:

function badWordsFilter(&$text){ 
    $excluded_words = array('butt', 'poop', 'crap'); 
    $replacements = array(); 

    $i = count($excluded_words); 
    while($i--){ 
     $tmp = $excluded_words{0}; 
     for($i=0;$i<(strlen($excluded_words)-1);$i++){ 
      $tmp .= '*'; 
     } 
     $replacements[] = $tmp; 
    } 

    str_replace($excluded_words, $replacements, $text); 
} 
+0

我该如何调用要替换的单词的功能? – user1528878 2012-07-18 20:19:47

+0

您应该只传递整个字符串,其中一些单词应该替换为该函数,并且它完成所有工作:) 为了添加要审查的单词,您只需将它们添加到$ excluded_words即可! – PoulsQ 2012-07-18 20:36:37

+0

我可以使用.TXT文件替换数组,以便我可以加载所有不良文字frm此文件? – user1528878 2012-07-19 06:02:24