我正在运行一个PHP / MySQL Webapp,用户可以在其中发布内容。由于存在垃圾邮件,我试图借助关键字来阻止垃圾邮件文本的上传者。
垃圾邮件发送者通常会输入一个我在黑名单上的whatsapp号。最近,他在数字中加了空格,因此我的逻辑不再起作用了。
例如:
我的系统检测到info
甚至是Infos
的一部分,但没有检测到定义为垃圾邮件关键字的数字,只是没有空格。
以下代码的相关行是:
$pos = stripos($data['txt'], $findme);
完整代码:
# Check for spam keywords
// get the keywords from the black list
$stmt="
SELECT
keyword,
weight
FROM
$DB.$T16
";
$result = execute_stmt($stmt, $link);
while ($row = db_get_row($result)){
$keyword[] = $row->keyword;
$weight[] = $row->weight;
};
$num_results = db_numrows($result);
if(!isset($spam['score'])) $spam['score'] = 0;
if(!isset($spam_level)) $spam_level = 0;
for ($i=0;$i<$num_results;$i++){
$findme = $keyword[$i];
$pos = stripos($data['txt'], $findme);
$pos2 = stripos($data['title'], $findme);
if ($pos !== false OR $pos2 !== false){ // this seems to be spam!
$spam_level += $weight[$i];
$triggered_keywords .= $keyword[$i].', ';
#echo $spam_level.':'.$keyword[$i].$br;
}
}
$spam['score'] += $spam_level;
如果数字作为关键字,则可以使用。例如。 +47179339393。但是由于垃圾邮件发送者现在正在输入+47 17 93 39 39 3及其变种,因此失败了。
如何更改Stripos功能以确保识别+47179339393的所有变体?
答案 0 :(得分:1)
假设所有变体定义为具有不同类型/数量的空白,则可以尝试剥离所有空白:
$number = "+47 17 93 39 39 3";
$number = preg_replace('/\s+/', '', $number);
要从文本中提取您的电话号码,请尝试使用preg_match_all
,例如:
$input = "Infos auch unter whatsapp nummber:+43 68 86 49 45 702";
preg_match_all("/\+?\d+(?:\s+\d+)*/", $input, $matches);
$number = preg_replace('/\s+/', '', $matches[0][0]);
echo $number;
+4368864945702
答案 1 :(得分:0)
您可以在此处使用preg_replace_callback()
并使用以下表达式:
\+?\d[\s\d]+\d
PHP
中,可能是:
<?php
$text = <<<END
That works if the number is as the keyword. E.g. +47179339393. But as the spammer is now entering +47 17 93 39 39 3 and variations of it, it failes.
How could I change the stripos function to make sure that all variant of +47179339393 will be recognized?
Infos auch unter whatsapp nummber:+43 68 86 49 45 702
END;
// put the numbers to ignore inside this array
$ignore = [];
// expression from above
$regex = "~\+?\d[\s\d]+\d~";
$text = preg_replace_callback(
$regex,
function($match) {
$stripped_number = preg_replace("~\s+~", "", $match[0]);
if (in_array($stripped_number, $ignore)) {
return "";
} else {
// leave it untouched
return $match[0];
}
echo $stripped_number;
},
$text);