preg_match字符串中的逗号

时间:2014-02-11 03:54:15

标签: php regex preg-match

我存储了一个坏的单词列表,我希望在将它们存储到数据库之前对其进行过滤。

我将错误的单词存储在一个数组中,我用一个管道分隔符进行内爆,以便进行一次检查。

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

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

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

我需要修改第一行,这样当邮件包含逗号等字符时,它就不会返回true,而你认为​​我会遇到同样的问题。

更新了一个不保存的示例帖子和一些坏词的数组:

不保存到db的示例消息(它在句子末尾包含空白字符):

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(爱国者这个词)。我需要帮助修改正则表达式来搜索整个单词而不是单词的碎片。

4 个答案:

答案 0 :(得分:1)

正如@ridgerunner在您的问题的评论中提到的,正则表达式“或”运算符需要围绕单词列表的括号。

例如,您当前的正则表达式如下:

/\bword1|word2|word3\b/

应该

/\b(word1|word2|word3)\b/

要使用PHP代码,请执行以下操作:

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

答案 1 :(得分:0)

我注意到您在代码中包含了速记字符类\b。我假设你在bad_words ...

周围包裹这些代币

这里的问题可能是,\b令牌不匹配,因为没有"字边界"以badwordz,结尾为例;它是一个非单词边界(\B)。

如果合适,您可能需要尝试不同的单词边界,例如空格 我需要更好地了解你正在应用你的正则表达式的内容,以便更好地表达。

答案 2 :(得分:0)

使用您的代码,它对我有用。也就是说,您的示例消息 会保存到数据库。

这就是我所拥有的:

// Set up array of bad words in $config['bad_words']
// $config['bad_words'] = array(
//   ...
// );

$imploded = implode('|', $config['bad_words']);
print "IMPLODED ARRAY: $imploded\n\n";

$bad_words_regex = "/\b$imploded\b/";
print "REGULAR EXPRESSION: $bad_words_regex\n\n";

$message = 'This is your last chance to decide between The Car, The Personality and the Lion ';
if (preg_match(strtolower($bad_words_regex), strtolower(trim($message))) == FALSE ) {
  print "SAVE\n";
}
else {
  print "DO NOT SAVE\n";
}

我在内爆时直接致电$config['bad_words'],而不是致电config_item

不确定上面修改后的代码是否包含所有这些打印语句,可能会指向正确的方向。

答案 3 :(得分:0)

由于你的单词在数组中,你可以使用PHP的内置函数'in_array'。那个,结合一些基本的REGEX,我认为可以得到你想要的东西。

// SET THE DEFAULTS
$sentence = 'The foxes, birds, and leopard-owls live in the forest.';
$bad_words = array('forest', 'lake', 'meadow');
$bad_word_found = false;


// REMOVE PUNCTUATION & LOWERCASE
// "the foxes birds and leopard-owls live in the forest"
$sentence_scrub = trim(strtolower(preg_replace('/[^A-Z0-9 -]/i', '', $sentence)));


// SPLIT THE SENTENCE INTO CHUNKS
$sentence_bits = explode(' ', $sentence_scrub);


// LOOP THROUGH THE ARRAY AND CHECK TO SEE IF ANY OF THE 
// - WORDS APPEAR IN THE BAD WORD ARRAY
foreach ($sentence_bits AS $potential_bad_word) {

    if (in_array($potential_bad_word, $bad_words)) {
        $bad_word_found = true;
    }

}


if ($bad_word_found) {
    // DO SOMETHING HERE
}
else {
    // GO AHEAD AND WRITE TO THE DB
}