首页 > 解决方案 > 如何使用正则表达式检查数字的 vor 变体?

问题描述

我正在运行一个 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 的所有变体?

标签: phpregex

解决方案


假设所有变体都被定义为具有不同类型/数量的空白,您可以尝试剥离所有空白:

$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

推荐阅读