更好的编码方式 - 检查被禁词的评论

时间:2013-01-29 11:43:12

标签: php regex arrays preg-replace profanity

是否有更好,更快的方法来执行以下操作?

这是一个类中的方法,用于检查注释中是否包含禁止的单词,如果是,则需要手动批准注释。

我真的不想改变我的模型/数据库的工作方式,因此理想情况下需要保留$this->get_words()(它返回一个具有从DB字段生成的属性的对象数组)。

P.S我知道亵渎过滤器等是不受欢迎的,但在这种情况下它只需要发表评论需要手动批准。

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

2 个答案:

答案 0 :(得分: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);
}

-OR -

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

现在你可以按照自己的意愿使用它......

答案 1 :(得分: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;
        }