符合指定规则的域名正则表达式构建需求及问题求助
解决域名正则匹配的问题
看起来你之前的正则组合在处理带协议前缀(比如http:/、http:)或者www.前缀时失效,而且没有完全覆盖你列出的5条规则。我来帮你构建一个精准满足需求的正则表达式,同时解释每个部分的作用,让你清楚为什么这么写。
核心需求对应的正则设计思路
我们需要匹配www.example.xx或example.xx这类域名,同时严格满足以下规则:
- 符合全球域名规范(字母、数字、连字符组成,不能以连字符开头/结尾)
- 无连续两个点
- 排除IP地址和FTP地址
- 结尾不能带
:xxxx格式的端口号 - 顶级域名后缀至少2个字符(比如
.com、.co.uk都允许,.c不行)
最终正则表达式
支持协议前缀(含不完整的http:/、http:)的版本
这个版本可以处理带完整http:///https://、不完整http://http:,以及www.前缀的情况:
^(?!ftp://)(?!.*\.\.)(?!.*:\d+$)(?!\d+\.\d+\.\d+\.\d+$)(?:https?://|http:\/?)?(?:www\.)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?){2,}$
纯域名匹配(不带任何协议前缀)的版本
如果只需要匹配www.example.xx或example.xx本身,用这个更简洁:
^(?!.*\.\.)(?!\d+\.\d+\.\d+\.\d+$)(?:www\.)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?){2,}$
正则各部分的作用拆解
让我们逐个看每个规则对应的正则逻辑:
^(?!ftp://):排除FTP地址(规则3),确保字符串不是以ftp://开头(?!.*\.\.):禁止连续两个点(规则2),用负向预查确保整个字符串里没有..(?!.*:\d+$):禁止结尾带端口号(规则4),排除字符串末尾是:数字的情况(?!\d+\.\d+\.\d+\.\d+$):排除IP地址(规则3),避免匹配类似192.168.1.1的纯IP字符串(?:https?://|http:\/?)?:支持协议前缀,可选匹配完整的http:///https://,或者不完整的http://http:,解决你之前遇到的前缀失效问题(?:www\.)?:支持www前缀,可选匹配www.,满足www.example.xx的格式需求(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+:匹配多级域名前缀,每个域名段符合全球规范(不能以连字符开头/结尾,由字母、数字、连字符组成)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?){2,}:确保顶级域名至少2字符(规则5),最后一个域名段长度≥2
测试案例
匹配成功的情况
example.comwww.example.co.ukhttp://example.xxhttps://www.example.xxhttp:/example.xxhttp:www.example.xx
匹配失败的情况
example.c(顶级域名仅1字符,违反规则5)example..com(含连续点,违反规则2)192.168.1.1(纯IP地址,违反规则3)ftp://example.com(FTP地址,违反规则3)example.com:8080(结尾带端口,违反规则4)-example.com(域名段以连字符开头,不符合规范)
结合HTML input使用的示例
如果你要在HTML的input[type="url"]里使用,记得可以加上pattern属性,同时因为浏览器默认的url验证可能冲突,建议加上novalidate属性关闭默认验证:
<form novalidate> <input type="url" pattern="^(?!ftp://)(?!.*\.\.)(?!.*:\d+$)(?!\d+\.\d+\.\d+\.\d+$)(?:https?://|http:\/?)?(?:www\.)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?){2,}$" title="请输入符合要求的域名:支持http/https前缀或www前缀,不能是IP/FTP地址,不能带端口,后缀至少2个字符" placeholder="输入域名" > <button type="submit">提交</button> </form>
内容的提问来源于stack exchange,提问作者Cod3n0d3
相关产品推荐
相关产品推荐

