如何从多格式URL中提取带语言部分的顶级域名(TLD)?
解决方案:用JS/TS提取带可选语言部分的有效TLD域名
核心问题拆解
需要从各类URL中精准提取域名(含有效TLD)+ 可选的语言路径段,同时解决以下痛点:
- 避免把
.dev这类子域名误判为TLD - 不受路径中点(如文件名
one.two.three)的干扰 - 兼容无语言部分的URL
实现思路
- 用原生
URLAPI解析URL,精准分离域名(hostname)和路径(pathname),比纯正则处理更可靠 - 预定义有效TLD列表,从域名末尾反向匹配,确保只识别合法的TLD
- 检查路径的第一个分段是否为有效语言码,仅保留符合条件的语言段
代码实现(TS/JS通用)
// 替换为你的20种有效TLD const VALID_TLDS = new Set(['com', 'de', 'org', 'net', 'io', 'uk', 'au']); // 可选:如果有固定语言列表,可定义在这里;无列表则默认匹配两位小写字母 const VALID_LANGUAGES = new Set(['fr', 'de', 'en', 'es', 'it']); function extractTldWithLanguage(urlStr: string): string | null { try { const url = new URL(urlStr); const { hostname, pathname } = url; // 从域名中定位有效TLD的位置 const hostnameSegments = hostname.split('.'); let validTldPosition = -1; // 从后往前遍历,找到第一个属于有效TLD的分段 for (let i = hostnameSegments.length - 1; i >= 0; i--) { if (VALID_TLDS.has(hostnameSegments[i].toLowerCase())) { validTldPosition = i; break; } } if (validTldPosition === -1) return null; // 未找到有效TLD,返回null // 提取完整域名(含所有子域名+有效TLD) const domain = hostname; // 处理路径中的语言部分 const pathSegments = pathname.split('/').filter(seg => seg.length > 0); let languageSuffix = ''; if (pathSegments.length > 0) { const firstPathSeg = pathSegments[0].toLowerCase(); // 判断是否为有效语言:优先用预定义列表,无列表则匹配两位小写字母 const isValidLang = VALID_LANGUAGES.size ? VALID_LANGUAGES.has(firstPathSeg) : /^[a-z]{2}$/.test(firstPathSeg); if (isValidLang) { languageSuffix = `/${firstPathSeg}`; } } return `${domain}${languageSuffix}`; } catch (err) { return null; // 无效URL格式,返回null } } // 测试示例URL const testCases = [ "https://www.mywebsite.com/fr/additional/path/", "https://www.mywebsite.com/de/", "https://www.mywebsite.de/en/", "https://www.mywebsite.de/fr/", "https://my.local.dev.env.de/en/one.two", "https://www.mywebsite.org/", "https://mywebsite.org", "https://www.mywebsite.com/fr/some/path/one.two.three/end/" ]; testCases.forEach((url, idx) => { const result = extractTldWithLanguage(url); console.log(`#${idx+1} 输入: ${url}\n输出: ${result}\n`); });
方案优势
- 精准性:通过预定义TLD列表,彻底避免把
.dev这类子域名误判为TLD - 可靠性:
URLAPI自动处理协议、端口、查询参数等边缘情况,比纯正则更稳定 - 灵活性:修改
VALID_TLDS和VALID_LANGUAGES即可适配业务需求,无需改动核心逻辑 - 兼容性:现代浏览器、NodeJS 10+均支持
URLAPI,TS/JS通用
测试结果
- #1 输出:
www.mywebsite.com/fr - #2 输出:
www.mywebsite.com/de - #3 输出:
www.mywebsite.de/en - #4 输出:
www.mywebsite.de/fr - #5 输出:
my.local.dev.env.de/en - #6 输出:
www.mywebsite.org - #7 输出:
mywebsite.org - #8 输出:
www.mywebsite.com/fr
内容的提问来源于stack exchange,提问作者r00k13
相关产品推荐
相关产品推荐

