-1

以下を行うためのより良い、より速い方法はありますか?

これは、コメントに禁止ワードが含まれているかどうかをチェックするクラスのメソッドです。含まれている場合は、コメントを手動で承認する必要があります。

モデル/データベースの動作方法を変更したくないので、$this->get_words()理想的にはそのままにしておく必要があります (DB フィールドから生成されたプロパティを持つオブジェクトの配列を返します)。

PS私は冒とく的なフィルターなどが嫌われていることを知っていますが、このシナリオでは、コメントに手動での承認が必要になるだけです.

public function check_string($str) {
    // Put banned words in an array
    $banned_words = [];
    foreach ($this->get_words() as $word) {
        $banned_words[] = $word->word;
    }

    $patterns = array(
        '/[_.-]/', '/1/', '/3/', '/4/', '/5/', '/6/',
        '/7/',     '/8/', '/0/', '/z/', '/@/'
    );
    $replacements = array(
        '',  'i', 'e', 'a', 's', 'g',
        't', 'b', 'o', 's', 'a'
    );

    // Turn str into array of individual words
    $str_words = explode(" ", $str);

    foreach ($str_words as $str_word) {
        $str_word = strtolower(preg_replace($patterns,$replacements,$str_word));
        if (in_array($str_word, $banned_words, true))
            return TRUE;
    }

    return FALSE;
}
4

2 に答える 2

1

不適切な単語置換単語をファイルに入れることができます。このような -

badword1,replaceword1
badword2,replaceword2
badword3,replaceword3

このようにファイルを読み取り、悪い単語置換単語の配列を作成します-

$allline_arr = file('bad_word.txt');
$badword_arr = array();
foreach ($allline_arr as $line) {
    $badword_arr[] = explode(',', $line);
}

-また-

$file = fopen("bad_word.txt","r");
$badword_arr = array();
while(! feof($file))
{
  $line = fgets($file);
  $badword_arr[] = explode(',', $line);
}
fclose($file);

これで思い通りに使えます…

于 2013-01-29T12:08:48.007 に答える