我存储了一个坏的单词列表,我希望在将它们存储到数据库之前对其进行过滤。
我将错误的单词存储在一个数组中,我用一个管道分隔符进行内爆,以便进行一次检查。
$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(爱国者这个词)。我需要帮助修改正则表达式来搜索整个单词而不是单词的碎片。
答案 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
}