-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 回答
1

你可以使用这个方法

var bannedWords = ["NO", "NO NAME", "NONAME", "MISS", "MS", "MS.", "MR", "MR.", "MRS", "MRS."];

function checkBannedWords(value) {
            var rgx = new RegExp(bannedWords.join("|"), "gi");
            if (value.replace(rgx,'*').indexOf('*') != -1) {
                return false;
            }
            return true;
        }
于 2017-09-05T08:39:01.400 回答