PHP如何改进preg_match正则验证无http/https/www前缀的域名
PHP裸域名校验正则改进方案
原有逻辑缺陷
当前使用的正则和提示存在3个核心问题:
- 正则
/^[a-zA-Z. ]+$/仅允许输入字母、英文点、空格,既没有拦截禁止的http/https/www前缀,也没有校验域名的基本结构,甚至允许输入空格、连续点这类完全非法的内容 - 错误提示文案逻辑写反,原文案提示用户域名要带http/https/www前缀,和实际校验要求完全相反
- 没有提前处理用户输入首尾可能误带的空格,容易出现合法输入被误判的情况
改进后实现代码
直接替换原有的判断分支即可:
// 先去除输入首尾的空格,避免误判 $domain = trim($domain); } elseif( !preg_match('/^(?!www\.|https?:\/\/)[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/', $domain) ) { $output['message'][] = '请输入不带http、https、www前缀的裸域名,正确格式例如example.com、hello.com'; }
正则规则说明
这个正则完全匹配校验要求,各部分作用如下:
(?!www\.|https?:\/\/):负向预查逻辑,只要输入开头是www.、http://、https://就直接判定不通过,从根源拦截所有禁止的前缀格式[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?:匹配二级域名主体,要求首尾必须是字母或数字,中间允许出现连字符,既兼容普通英文域名,也不会放行连字符在首尾、含特殊字符的非法内容\.[a-zA-Z]{2,}:匹配域名后缀的点和顶级域,要求顶级域至少2位字母,覆盖com、net、cn等绝大多数通用顶级域、国家顶级域格式- 首尾的
^和$严格限制输入从开头到结尾必须完全符合规则,不会放行域名前后夹带多余字符的输入
内容的提问来源于stack exchange,提问作者Shibbir
相关产品推荐
相关产品推荐

