多格式输入正则校验修复:IP校验失败误判为域名问题
修复单输入多格式校验函数:避免无效IP被误判为合法域名
原函数需支持IPv4、IPv6及带子域名的域名校验,但存在逻辑缺陷:当输入为无效IPv4地址(如123.123.255.256,最后一段数值超过255)时,会被误判为合法域名返回true。核心问题是原逻辑仅先校验IP合法性,不合法就直接走域名校验,而无效IP的格式刚好符合域名正则的匹配规则。
解决方案思路
- 优先判断输入是否具有IP格式特征(而非直接校验合法性)
- 若为IP格式特征,严格校验IP合法性,不合法直接返回
false - 若不是IP格式特征,再校验域名合法性
修改后的代码
validateDomain = (input) => { // 修正域名正则:移除空格匹配,符合域名规范(域名不含空格) const domainRegex = /^(?=.{0,63}$)([A-Za-z0-9]+([-_][A-Za-z0-9]+)*(\.[A-Za-z0-9]{2,6})*)?$/; // 严格的IP校验正则(兼容IPv4+IPv6) const ipRegex = /^\b((?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])|(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4})\b$/; // 判断输入是否具备IP格式特征 const isIpFormat = // IPv4格式特征:四段数字+三个点的结构 /^\d+\.\d+\.\d+\.\d+$/.test(input) || // IPv6格式特征:包含冒号,且仅由十六进制字符、冒号、点组成 /^[0-9a-fA-F:.]+$/.test(input) && input.includes(':'); if (isIpFormat) { // 是IP格式,严格校验合法性 return ipRegex.test(input); } else { // 非IP格式,校验域名合法性 return domainRegex.test(input); } };
关键修改点说明
- IP格式前置判断:新增
isIpFormat检查,先识别输入是否属于IP类格式,彻底避免无效IP流入域名校验逻辑 - 域名正则修正:移除原正则中的
\s*,因为域名规范不允许包含空格,防止带空格的非法字符串被误判 - 逻辑重构:先判断格式类型,再针对性校验,确保无效IP不会被当作域名处理
测试验证
- 输入
123.123.255.256:符合IPv4格式特征,IP校验不通过,返回false - 输入
192.168.1.1:IPv4校验通过,返回true - 输入
2001:0db8:85a3:0000:0000:8a2e:0370:7334:IPv6校验通过,返回true - 输入
sub.example.co.uk:域名校验通过,返回true - 输入
invalid@domain:域名校验不通过,返回false
内容的提问来源于stack exchange,提问作者Razak
相关产品推荐
相关产品推荐

