JavaScript URL最近匹配域名算法问题:错误匹配案例排查
问题分析
你的暴力匹配算法出错的核心原因是使用了String.includes()做字符串包含检查,而非精确的域名后缀匹配。比如xgo.google.com里的xgo包含go,导致go.google.com被误判为匹配,但实际上它并不是输入域名的合法后缀子域名。
正确的匹配逻辑应该是:目标域名必须是输入域名的完整后缀,即满足以下两个条件之一:
- 输入域名与目标域名完全相等
- 输入域名以
.${目标域名}结尾
修复后的代码
const domainArr = ["google.com", "go.google.com", "pro.go.google.com"]; const pureHostName = "xgo.google.com"; // 先按域名长度降序排序,优先检查更长的域名(最近匹配) const sortedDomains = [...domainArr].sort((a, b) => b.length - a.length); let selectedDomain = ""; for (const domain of sortedDomains) { // 检查是否是完整后缀匹配 if (pureHostName === domain || pureHostName.endsWith(`.${domain}`)) { selectedDomain = domain; break; // 找到最长匹配后直接退出循环 } } console.log("selectedDomain--->", selectedDomain); // 输出google.com,符合预期
代码说明
- 排序处理:将域名列表按长度从长到短排序,这样一旦找到第一个符合条件的域名,就是我们需要的「最近匹配」(最长有效后缀),无需再遍历后续更短的域名。
- 后缀匹配逻辑:用
endsWith(.${domain})确保匹配的是完整的子域名后缀,避免部分字符串匹配的错误。同时保留完全相等的判断,处理输入域名与列表中某域名完全一致的场景。
测试验证
针对所有示例场景测试,结果均符合预期:
hello.go.google.com→ 匹配go.google.comabc.hello.go.google.com→ 匹配go.google.comqwert.pro.go.google.com→ 匹配pro.go.google.compro1.go.google.com→ 匹配go.google.comxyz.google.com→ 匹配google.comxgo.google.com→ 匹配google.com(修复后的正确结果)
内容的提问来源于stack exchange,提问作者MochaTesty
相关产品推荐
相关产品推荐

