0

ユーザーが悪い単語を入力したときに、badwordsを置き換えるのではなく、「入力に許可されていない単語が含まれています」というエラーが表示されるように、下記のbadwordsフィルターコードに他の場合を実装する方法はありますか?

FUNCTION BadWordFilter(&$text, $replace){

$file_array = file('/path/to/badword.txt');


$bads = array();
foreach ($file_array as $word_combo) {
$bads[] = explode(',', $word_combo);
}



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
  }     
 }

}

$any = BadWordFilter($qtitle,1); 
$any = BadWordFilter($qtitle,0); 
4

1 に答える 1

0

私が正しく理解していれば、関数の戻り値が「悪い言葉」が置き換えられたこと、または見つかったことを示しているかどうかを確認する方法が必要なだけです。現在持っているものを考えると、それらを置き換えるかどうかはすでにわかっていますreturn 0;。メソッドの最後に a を追加するだけで、置き換えが行われていないか、悪い言葉が見つからなかったことを示します。

これを処理する方法でサンプルを書き直しました。書き直しでは、と とeregi_replace()eregi()使用法もそれぞれ変更しました。前の 2 つの方法は非推奨であり、使用しないでください。また、私は以下をテストしていません。これは概念実証としてのみ意図されています。preg_replace()preg_match()

function BadWordFilter(&$text, $replaceWords = false) {
    $file_array = file('/path/to/badword.txt');
    $bads = array();
    foreach ($file_array as $word_combo) $bads[] = explode(',', $word_combo);

    if ($replaceWords == true) {
        $original = $text;
        foreach ($bads as $bad) {
            // replace any bad word instance
            $text = str_replace($bad[0], $bad[1], $text);
        }
        // check if bad words have been replaced
        return ($text == $original) ? false : true;
    } else {
        foreach ($bads as $bad) {
            if (strpos($text, $bad[0]) !== false) {
                // found a bad word
                return true;
            }
        }
        // no bad words found
        return false;
    }
}

$error = '';
// replace words:
if (BadWordFilter($qtitle, true)) {
    $error = 'Your input contained bad words and they have been replaced.';
}
// don't replace words:
if (BadWordFilter($qtitle, false)) {
    $error = 'Your input contains words that are not allowed.';
}

更新:「悪い言葉」ファイルのサンプル入力テキストを見た後、正規表現は必要ありません。と の元の置換をそれぞれpreg_replace()preg_match()に置き換えました。str_replace()strpos()

于 2012-07-25T16:13:55.027 に答える