Как проверить варианты номера с помощью регулярного выражения? - PullRequest
1 голос
/ 27 марта 2019

Я запускаю веб-приложение PHP / MySQL, где пользователи могут публиковать контент. Из-за спама я пытаюсь заблокировать загрузчики спам-текста с помощью ключевых слов.

Спаммер, как правило, вводит номер 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 ]

1 голос
/ 27 марта 2019

Предполагая, что все варианты определены как имеющие разные типы / количества пробелов, вы можете просто попытаться удалить все пробелы:

$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
0 голосов
/ 27 марта 2019

Вы можете использовать preg_replace_callback() здесь со следующим выражением:

\+?\d[\s\d]+\d

См. демо на 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...