如何使用正则表达式检查数字的vor变体?

时间:2019-03-27 07:01:44

标签: php regex

我正在运行一个PHP / MySQL Webapp,用户可以在其中发布内容。由于存在垃圾邮件,我试图借助关键字来阻止垃圾邮件文本的上传者。

垃圾邮件发送者通常会输入一个我在黑名单上的whatsapp号。最近,他在数字中加了空格,因此我的逻辑不再起作用了。

例如:

enter image description here

我的系统检测到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的所有变体?

2 个答案:

答案 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

请参见a demo on regex101.com



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);