
本文介绍一种通过预处理文本并结合字符串匹配来精准识别拼接式 spam 域名(如 a#b#c#d#e#f.com)的实用方案,避免正则误杀,提升过滤准确率。
在对抗持续绕过规则的垃圾信息发送者时,依赖复杂正则表达式(如 (?先归一化,再精确判断。
核心策略分两步:
- 文本净化(Sanitization):移除所有非字母数字字符,仅保留 a–z、A–Z、0–9,将各类干扰格式统一还原为原始字符序列;
- 子串匹配(Exact Substring Check):在净化后的纯文本中,直接查找目标关键词(如 'abcdef'),无需关心原始分隔符。
示例代码如下:
// 假设 $textfield 是用户提交的待检测文本(可能含 URL、描述等)
$cleaned = preg_replace('/[^A-Za-z0-9]/', '', $textfield); // 一步清除所有符号/空格/特殊分隔符
// 检查是否包含被滥用的连续域名片段(不区分大小写)
if (stripos($cleaned, 'abcdef') !== false) {
// 触发拦截逻辑:标记为 spam,拒绝发布或要求人工审核
die('Spam domain detected: abcdef.com variant blocked.');
}✅ 优势说明:
- ✅ 简洁高效:无回溯风险,性能远优于多组前瞻断言的正则;
- ✅ 高精度:仅当 a, b, c, d, e, f 按序连续出现(中间无其他字母数字干扰)时才触发,彻底规避“任意顺序匹配”的误报;
- ✅ 易扩展:如新增 xyz123.com 变体,只需增加一行 stripos($cleaned, 'xyz123') 即可;
- ✅ 兼容性强:对 a b c d e f.com、a$b$c$d$e$f.com、a·b·c·d·e·f.com、甚至 azuojiankuohaophpcnbyoujiankuohaophpcnc[d]e{f}.com 均能正确归一化为 abcdefcom,从而捕获 abcdef 子串。
⚠️ 注意事项:
- 若目标域名本身含数字或大小写混合(如 AbC123.com),请确保 stripos() 或统一转小写后再匹配(strtolower($cleaned));
- 此法假设 spammer 的核心特征是字符顺序不变但插入干扰符;若其开始打乱顺序(如 f#e#d#c#b#a.com),需升级为字符频次统计或编辑距离算法,但当前场景下极少发生;
- 建议配合日志记录被拦截的原始 $textfield,用于持续分析新变种,动态更新关键词列表。
综上,与其在正则迷宫中疲于奔命,不如用“清洗 + 精确匹配”构建一道轻量而锋利的防线——简单,可靠,且经得起时间考验。










