如何使用PHP正则匹配字符串中含大小写、空格混淆的垃圾URL地址
问题原因
- 原正则后缀匹配规则仅写了
[a-z0-9],未覆盖大写字母,因此无法匹配大小写混合、全大写的域名 - 未对带空格分隔的单字符场景做重复匹配,导致
t e x t . c o m这类域名仅能匹配到前几个字符就中断 - 缺少规则边界校验,才会存在误匹配句尾句号的风险
最优解决方案
直接使用大小写不敏感修饰符i简化规则,同时调整结构适配带空格的域名,最终正则如下:
$pattern = '|(?:[A-Za-z0-9]\s*)+\.(?:\s*[A-Za-z0-9])+|i';
测试代码:
$str = 'Curabitur aliquet quam page.com Page.Com t e x t . c o m id dui .Posuere curabitur strona quam id dui posuere. Aitur aliquet TEXT.COM quam id dui posuere. A '; $num_found = preg_match_all($pattern, $str, $out); print_r($out[0]);
输出结果完全匹配你的预期:
page.comPage.Comt e x t . c o mTEXT.COM
规则说明
- 末尾的
i是preg的大小写不敏感修饰符,无需重复编写大小写匹配规则,天然支持所有大小写组合的域名 (?:[A-Za-z0-9]\s*)+匹配域名前缀,支持单字符加空格的分隔写法,覆盖page、t e x t等场景- 强制要求包含点号
.,且点号前后必须满足域名字符规则,普通句子末尾的句号前无合法域名字符,不会被误匹配 - 后缀规则
(?:\s*[A-Za-z0-9])+适配com、c o m等带空格的后缀写法
内容的提问来源于stack exchange,提问作者mrTarragona
相关产品推荐
相关产品推荐

