如何改造字符串域名数组适配正则表达式,实现精准域名匹配?
域名匹配问题解决方案
问题描述
我有一个存储域名的字符串数组:
var sites = ["site2.com", "site2.com", "site3.com"];
需要检查字符串domainName是否与数组中的某个站点匹配。最初用indexOf可以正常匹配完全一致的域名,但当domainName带有子域名(比如subpage.site1.com)时无法识别。
尝试过用some结合正则测试:
if(sites.some(function(rx) { return rx.test(domainName); })
但遇到两个问题:
- 必须把数组元素改成正则字面量(如
var sites = [/site1.com/, /site2.com/, /site3.com/];),但希望保留字符串形式方便终端用户使用; - 会出现误匹配,比如
anothersite1.com会被判定匹配site1.com。
试过用replace和concat构造^([a-z0-9]+[.])*site1\.com$这类正则,但转义字符处理麻烦,想找更简便的实现方式。
解决方案
方案1:后缀匹配法(无正则,简单直接)
不需要用正则,直接拆分域名片段,从后往前拼接成可能的域名后缀,和数组里的域名对比。先对数组去重还能优化性能。
代码实现:
var sites = ["site2.com", "site2.com", "site3.com"]; // 去重处理,避免重复判断 const uniqueSites = [...new Set(sites)]; function isDomainMatch(domainName) { const domainParts = domainName.split('.'); // 生成所有可能的后缀域名,逐一匹配 for (let i = 0; i < domainParts.length - 1; i++) { const candidateDomain = domainParts.slice(i).join('.'); if (uniqueSites.includes(candidateDomain)) { return true; } } // 最后检查是否完全匹配 return uniqueSites.includes(domainName); } // 测试用例 console.log(isDomainMatch("subpage.site2.com")); // 输出 true console.log(isDomainMatch("anothersite2.com")); // 输出 false console.log(isDomainMatch("site3.com")); // 输出 true
方案2:正确转义的正则匹配法
如果偏好正则实现,关键是先转义域名里的特殊正则字符(比如.),再构造能匹配子域名后缀的规则,确保匹配的是完整的域名结尾部分,不会出现误匹配。
代码实现:
var sites = ["site2.com", "site2.com", "site3.com"]; const uniqueSites = [...new Set(sites)]; function isDomainMatch(domainName) { return uniqueSites.some(site => { // 转义正则特殊字符,避免语法错误或误匹配 const escapedSite = site.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 构造正则:匹配域名本身,或前面带任意子域名(以.分隔)的情况 const matchRule = new RegExp(`(^|\\.)${escapedSite}$`, 'i'); return matchRule.test(domainName); }); } // 测试用例 console.log(isDomainMatch("subpage.site2.com")); // 输出 true console.log(isDomainMatch("anothersite2.com")); // 输出 false console.log(isDomainMatch("SITE3.COM")); // 输出 true(忽略大小写)
内容的提问来源于stack exchange,提问作者Atex
相关产品推荐
相关产品推荐

