Preg_Match字符串中的逗号

2022-03-29 00:00:00 regex php preg-match

在将过滤帖子存储到数据库之前,我先存储它们的列表,然后再针对它们发帖。

我将坏字存储在数组中,并使用管道分隔符进行内爆,以便执行一次检查。

$bad_words_regex = "/" . implode('|', config_item('bad_words')) . "/";

if( preg_match(strtolower($bad_words_regex), strtolower(trim($message))) == FALSE ) {
    // save to database
}

我注意到带有逗号的消息没有保存到数据库中。我想我还应该检查其他字符(-、_、@、#)。

我需要修改第一行,以便当消息包含逗号之类的字符和您认为我会遇到相同问题的其他字符时,它不会返回True。

更新为未保存的示例帖子和一些坏词的数组:

未保存到数据库的示例消息(在句子末尾包含一个空格字符):

This is your last chance to decide between The Car, The Personality and the Lion 

坏字数组(不是完整列表)

//bad words array
$config['bad_words'] = array(
    '2g1c',
    '2 girls 1 cup',
    'acrotomophilia',
    'anal',
    'anilingus',
    'Split',
    'anus',
    'arsehole',
    'ass',
    'asshole',
    'assmunch',
    'auto erotic',
    'autoerotic',
    'babeland',
    'baby batter',
    'ball gag',
    'ball gravy',
    'ball kicking'
);

更新:我发现它找到了两个匹配的实例,pis(剧集中的pis)和trio(单词中的爱国者)。我需要帮助修改正则表达式以搜索整个单词,而不是单词的片段。


解决方案

正如@ridgerunner在您问题的注释中提到的,正则表达式"或"运算符需要将单词列表括起来。

例如,您当前的regex如下所示:

/word1|word2|word3/

它应该是:

/(word1|word2|word3)/

要使其与您的PHP代码一起工作,请执行如下操作:

$bad_words_regex = "/(" . implode('|', config_item('bad_words')) . ")/";

相关文章