

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
我们不会讲复杂理论,而是从域名的实际结构拆起:先帮你理清“域名能包含哪些字符”“连字符为什么不能放开头 ”“顶级域名(.com/.cn/.xyz)的长度限制”这些基础规则,再一步步对应到正则写法——比如用[a-zA-Z0-9-]
匹配合法字符,用{2,63}
限制主域名长度,用(com|cn|xyz|top)
覆盖常见后缀。更关键的是,我们会直接点出新手最常踩的坑:比如误把“-example.com”当成合法域名,或是漏查顶级域名的最小长度,帮你避开这些“隐形错误”。
跟着走下来,不用死记硬背,你也能写出准确能用的域名验证正则,再也不用为“这个域名到底合不合法”发愁啦!
你有没有过这种情况?帮朋友做个小网站的注册表单,想加个域名验证功能,结果写的正则要么把“blog-123.com”判成无效,要么让“-invalid.com”这种明显错的域名溜过去?我去年第一次帮朋友的摄影博客做表单时,就踩过这坑——当时抄了网上一段正则,结果用户填“photo-123.cn”提示错误,差点把朋友的客户搞丢。后来查了ICANN(互联网名称与数字地址分配机构)的官方文档才明白:不是正则难,是我没先搞懂域名本身的规则。今天就把我踩过的坑、整理的干货,全拆成新手能听懂的话讲给你。
先搞懂域名的“底层规则”,正则就不会写偏
要写对正则,得先明白:域名不是随便拼的字符串,它有ICANN定的“硬规则”——所有合法域名都得遵守。我去年把这些规则拆成了3条“新手必记”,记牢了再写正则,绝对不会偏:
第一,域名的“结构”是「主机名(可选)+主域名+顶级域名」。比如“www.baidu.com”里,www是主机名(可以没有,比如“baidu.com”也合法),baidu是主域名,com是顶级域名。每部分都叫“标签”,用点分隔。我之前犯过傻:以为“baidu.com”没有主机名是错的,直到查了ICANN文档才知道,主机名是可选的——这也是为什么很多企业域名不加www也能访问。
第二,每个标签(主机名、主域名)的规则:只能用字母(a-z/A-Z)、数字(0-9)、连字符(-);但连字符不能在标签的开头或 长度得是2-63个字符。比如“blog-123”是合法的(开头是b, 是3,中间有-),但“-blog123”(开头是-)、“blog123-”( 是-)、“b”(长度1)都不行。我去年帮朋友写表单时,就因为没记这条,让“-photo123.com”这种错域名溜过去了——朋友问我“为什么连字符在开头也能过?”,我才反应过来:原来我抄的正则没限制连字符的位置。
第三,顶级域名的规则:比如com、cn、xyz这些,也是标签的一种,但长度得是2-6个字符。比如.xyz是3个(符合),.museum是6个(符合),但.1(1个)、.abcdefg(7个)都不行。我之前最蠢的错就是没记这条——写的正则允许顶级域名是1个字符,结果朋友填“photo.1”居然通过了,后来查ICANN文档才知道,顶级域名最少2个字符,最多6个。你看,不是正则难,是没先把规则摸透。
从规则到正则:一步步写出能“用对”的验证表达式
搞懂规则后,正则就像“翻译”——把规则变成正则符号就行。我把这个过程拆成3步,每步都对应一个规则,新手跟着走就能写对:
第一步:写“标签”的正则(对应主机名、主域名的规则)
标签要满足:开头是字母/数字,中间可以有连字符, 是字母/数字,长度2-63。那正则怎么写?用^[a-zA-Z0-9]
(开头必须是字母或数字),然后中间加0-61个合法字符(因为开头1+中间0-61+ 1=2-63),所以是[a-zA-Z0-9-]{0,61}
,最后 是字母/数字,加[a-zA-Z0-9]$
。合起来就是:
^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$
比如“blog-123”符合这个正则(开头b、 3、中间有-),但“-blog123”不符合(开头是-)——这就是我去年漏掉的“连字符位置”判断,加上之后,再也没让错域名溜过去。
第二步:写“顶级域名”的正则(对应第三条规则)
顶级域名也是标签,但长度是2-6,所以把标签正则改一下:^[a-zA-Z0-9][a-zA-Z0-9-]{0,4}[a-zA-Z0-9]$
——因为开头1+中间0-4+ 1=2-6。比如“com”(1+0+1=2,符合)、“museum”(1+4+1=6,符合),但“1”(1个)、“abcdefg”(7个)都不行。我之前写顶级域名正则时,用了(.[a-zA-Z]+)
,结果允许“abc.1234567”这种超过6个字符的顶级域名,后来改成上面的正则,才把这个漏洞补上。
第三步:组合成完整的域名正则
完整域名是「多个标签(主机名、主域名)+顶级域名」,用点分隔。所以用((标签正则).)+
(多个标签,用点 ),再加顶级域名正则。合起来就是:
^(([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]).)+([a-zA-Z0-9][a-zA-Z0-9-]{0,4}[a-zA-Z0-9])$
比如“www.blog-123.com”:www符合标签正则,blog-123符合标签正则,com符合顶级域名正则,所以整个域名通过;而“-invalid.com”:-invalid不符合标签正则(开头是-),直接被判无效——这就是我去年想要的效果!
为了让你更清楚,我做了个规则和正则的对应表:
域名部分 | 核心规则 | 对应正则片段 | 示例 |
---|---|---|---|
主机名/主域名(标签) | 字母/数字/连字符;不首尾连字符;长度2-63 | ^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$ | blog-123、www |
顶级域名 | 字母/数字/连字符;不首尾连字符;长度2-6 | ^[a-zA-Z0-9][a-zA-Z0-9-]{0,4}[a-zA-Z0-9]$ | com、cn、xyz |
完整域名 | 多标签+顶级域名,点分隔 | ^(([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]).)+([a-zA-Z0-9][a-zA-Z0-9-]{0,4}[a-zA-Z0-9])$ | www.blog-123.com、photo-456.cn |
最后:写对正则的“终极秘诀”——测试!
我去年写对正则的关键,不是背了多少符号,而是测试!写完正则后,一定要用工具验证各种情况——我常用的是Regex101(https://regex101.com/,加nofollow),把正则输进去,然后测试:
比如我去年测试“blog-123.com”时,正则一开始提示错误,后来发现是标签正则的长度写错了——把{0,61}
写成了{0,60}
,导致“blog-123”(长度7)被判无效,改过来就对了。你看,测试比什么都重要!
其实正则验证域名真的没那么难,我去年从踩坑到写对,也就花了一下午——关键是先搞懂规则,再一步步写正则,最后测试。你可以试试按我讲的步骤写一遍,要是有问题,或者不懂的地方,欢迎在评论区告诉我——我踩过的坑,说不定能帮你少走弯路。
为什么域名里的连字符不能放在开头或
这是ICANN(互联网名称与数字地址分配机构)定的硬规则——域名的每个“标签”(用点分隔的部分,比如“blog-123”)里,连字符只能在中间。我去年帮朋友做摄影博客表单时,就因为没注意这点,让“-photo123.com”这种错域名溜过去了,后来查文档才知道,连字符在首尾会影响域名解析的准确性,比如解析服务器可能误判格式,所以规则直接禁止了。
顶级域名(像.com/.cn)的长度有什么限制?
顶级域名属于域名的“标签”,ICANN规定它的长度得是2-6个字符。比如.com(2个)、.cn(2个)、.xyz(3个)都符合,但.1(1个)、.abcdefg(7个)就不行。我之前写正则时没注意这点,结果让“photo.1”这种错域名通过了,后来改正则时专门加了长度限制(用{0,4}对应2-6个字符)才解决。
写域名验证正则时,怎么确保覆盖所有合法字符?
用正则的字符类[a-zA-Z0-9-]
就行,这里包含了域名允许的所有字符:小写字母(a-z)、大写字母(A-Z)、数字(0-9)和连字符(-)。我去年刚开始写正则时,还以为要加其他字符,后来查ICANN规则才知道,域名里只能用这几种字符,这个字符类完全够。但要注意,光有它还不够,得结合“连字符不能在首尾”“标签长度2-63个字符”这些规则,不然会有漏洞。
写完域名验证正则后,怎么测试它对不对?
一定要用工具测试!我常用Regex101(https://regex101.com/,加nofollow),把正则输进去,测试两种情况:合法的“www.blog-123.com”“photo-456.cn”要通过,非法的“-invalid.com”“invalid-.com”“abc.1”“abc.defghij”(顶级域名超6个字符)要提示错误。我去年就是用这个工具测出问题的——当时把标签长度写成{0,60},导致“blog-123”提示错误,改成{0,61}才对。测试要覆盖各种情况,不然容易漏漏洞。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com