You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多格式URL中提取带语言部分的顶级域名(TLD)?

解决方案:用JS/TS提取带可选语言部分的有效TLD域名

核心问题拆解

需要从各类URL中精准提取域名(含有效TLD)+ 可选的语言路径段,同时解决以下痛点:

  • 避免把.dev这类子域名误判为TLD
  • 不受路径中点(如文件名one.two.three)的干扰
  • 兼容无语言部分的URL

实现思路

  1. 用原生URL API解析URL,精准分离域名(hostname)和路径(pathname),比纯正则处理更可靠
  2. 预定义有效TLD列表,从域名末尾反向匹配,确保只识别合法的TLD
  3. 检查路径的第一个分段是否为有效语言码,仅保留符合条件的语言段

代码实现(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
  • 可靠性:URL API自动处理协议、端口、查询参数等边缘情况,比纯正则更稳定
  • 灵活性:修改VALID_TLDS和VALID_LANGUAGES即可适配业务需求,无需改动核心逻辑
  • 兼容性:现代浏览器、NodeJS 10+均支持URL API,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:17:51