php - 如何使用正则表达式检查数字的 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 的所有变体?
解决方案
假设所有变体都被定义为具有不同类型/数量的空白,您可以尝试剥离所有空白:
$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
推荐阅读
- r - 具有二项式响应变量的 glmer 给出了奇怪的残差分布
- python - 在 jetson nano 上使用 systemd 和服务文件运行 python 脚本
- nginx - NGINX IP Hash 平衡方法未按预期工作
- mongodb - MongoDB 使用 $group 为聚合管道输出多个相同的值
- angular - Angular 单页应用程序在刷新时抛出 404 错误
- typescript - 在包裹中为 scss 生成 TypeScript 类型
- java - 无法在 Elastic Beanstalk 中将 HTTP 重定向到 HTTPS
- jestjs - 未调用 Jest 部分模块模拟
- python - 掩码字符串 python
- javascript - 角度复制一行表格