JS端符合域名注册规范的Regex校验实现方案求助
JS域名校验功能实现方案
核心实现代码
function validateDomains(input) { // 域名格式校验正则,不含协议、长度校验逻辑 const domainFormatReg = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/ // 按分号拆分域名,过滤空值、去除每一项首尾空白字符 const domainList = input.split(';').map(item => item.trim()).filter(Boolean) const invalidDomains = [] for (const domain of domainList) { // 移除http/https协议头 const noProtocolDomain = domain.replace(/^https?:\/\//, '') // 格式校验 if (!domainFormatReg.test(noProtocolDomain)) { invalidDomains.push(domain) continue } // 提取域名主体(自动剔除末尾顶级域名后缀) const mainPart = noProtocolDomain.slice(0, noProtocolDomain.lastIndexOf('.')) // 主体长度校验 if (mainPart.length > 63) { invalidDomains.push(domain) } // 若需限制子域名每一级标签长度都不超过63,可替换上面的长度校验逻辑为: // const labelList = mainPart.split('.') // if (labelList.some(label => label.length > 63)) { // invalidDomains.push(domain) // } } return { allValid: invalidDomains.length === 0, invalidDomains: invalidDomains } }
方案说明
- 执行效率远高于多正则匹配方案:仅用1条正则完成格式校验,长度校验通过原生字符串方法实现,避免多正则匹配、正则多重断言带来的性能损耗
- 完全匹配需求规则:
- 自动忽略输入的
http:///https://协议头,统计主体长度时自动排除顶级域名后缀 - 正则约束每一段域名首尾不可为连字符,中间可正常使用连字符
- 仅允许字母、数字、连字符、英文句号,无其他特殊字符
- 天然支持子域名的英文句号分隔场景
- 自动拆分分号分隔的多个域名单独校验,返回全局校验结果和不合规的域名列表
- 自动忽略输入的
测试示例
// 符合规则的输入 validateDomains('text-example.com; test.sub.example.com; https://demo123.com') // 返回 {allValid: true, invalidDomains: []} // 不符合规则的输入 validateDomains('-test.com; test@example.com; verylongnamethatexceeds63charactersssssssssssssssssssssssssss.com; test-.com') // 返回包含上述4个不合规域名的结果
内容的提问来源于stack exchange,提问作者Artur Żółkiewski
相关产品推荐
相关产品推荐

