Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更好的编码方法-检查注释中的禁用词_Php_Regex_Arrays_Preg Replace_Profanity - Fatal编程技术网

Php 更好的编码方法-检查注释中的禁用词

Php 更好的编码方法-检查注释中的禁用词,php,regex,arrays,preg-replace,profanity,Php,Regex,Arrays,Preg Replace,Profanity,有没有更好、更快的方法来完成下面的工作 这是一个类中的方法,用于检查注释中是否有禁止的单词,如果有,则需要手动批准注释 我真的不想改变我的模型/数据库的工作方式,所以理想情况下需要保留$this->get_words()(它返回一个包含从DB字段生成的属性的对象数组) 另外,我知道亵渎过滤器等是不受欢迎的,但在这种情况下,它只会发表评论,需要手动批准 public function check_string($str) { // Put banned words in an array

有没有更好、更快的方法来完成下面的工作

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

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

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

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

您可以将坏字替换字放入文件中。 像这样-

badword1,replaceword1
badword2,replaceword2
badword3,replaceword3
像这样读取文件,并创建一个坏单词数组和替换单词-

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


现在你可以随心所欲地使用它了……

你可以使用这种方法

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

你知道真的没有办法有效地阻止所有可能的亵渎,对吧?嗨,瑟布鲁斯,我知道。正如我所说,亵渎并没有被阻止或取代——它只是意味着评论在出现在网站上之前需要得到批准。信不信由你,我们的网站上的评论实际上存在法律问题——因此,至少在大多数情况下,基于适度的亵渎的评论应该对我们有所帮助。嗯,我明白了。那么,我建议让过滤器捕捉更多。(直接后跟不带空格的字符串的数字,反之亦然,包含非ASCII字符的字符串,包含通常不在字符串中使用的标点符号的字符串:
\/|[]{}
,诸如此类的东西。好建议,我会加进去。嗨,我实际上并不是在替换坏单词。只是检查它们是否存在。从文件中读取它们会比从数据库中读取更快吗?如果你将文本存储在文件中而不是数据库中,你可以用最简单的方式修改它。你可以创建一个由逗号分隔的单词和字符组成的csv文件在php代码中,若要将这些单词存储到数据库中,请读取该文件并生成一个insert查询。
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;
        }