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

如何分割字符串获取根URL?匹配URL根域名代码失效求排查

搞定URL根域名提取与代码bug排查

嘿,我来帮你解决这两个技术问题,顺便把你代码里的坑给填上~

一、怎么用代码提取URL的根域名?

别用手动split字符串啦,太容易踩坑(比如遇到带端口、带用户名密码的URL就歇菜),用浏览器原生的URL API才是最稳的:

function getRootDomain(url) {
  const urlObj = new URL(url);
  let hostname = urlObj.hostname;
  // 去掉开头的www.(如果有的话)
  if (hostname.startsWith('www.')) {
    hostname = hostname.slice(4);
  }
  return hostname;
}

// 测测看:
console.log(getRootDomain('https://www.example.com/12xy45')); // 输出 example.com
console.log(getRootDomain('https://example.com/random')); // 输出 example.com
console.log(getRootDomain('http://blog.example.co.uk/post/1')); // 输出 example.co.uk

这个方法能自动处理各种合法URL的边缘情况,比手动分割靠谱多了。

二、如何从文本里只匹配根域名,不是完整URL?

如果要从一段杂文本里揪出所有根域名(比如文本里混着“去https://www.example.com逛逛,或者看看example.org的内容”),可以用正则表达式来匹配,同时避开完整URL的前缀:

function extractRootDomains(text) {
  // 正则规则:匹配带/不带www的域名,排除前面的http/https前缀,同时不包含路径
  const domainRegex = /(?:^|\s)(?:www\.)?([a-zA-Z0-9-]+\.[a-zA-Z]{2,})(?=\s|$|\/)/g;
  const uniqueDomains = new Set();
  let match;
  
  while ((match = domainRegex.exec(text)) !== null) {
    // 统一去掉www.,存入集合去重
    const domain = match[1].replace(/^www\./, '');
    uniqueDomains.add(domain);
  }
  
  return Array.from(uniqueDomains);
}

// 测试示例:
console.log(extractRootDomains('我常逛https://www.example.com/12xy45和http://example.org/random,还有test.co.uk的博客'));
// 输出 ["example.com", "example.org", "test.co.uk"]

这个正则能匹配独立出现的域名,不会把URL里的路径部分带进来,对于.co.uk这类多级域名也能正常识别。

三、你的代码为啥跑不起来?我帮你揪出3个问题

看你贴的这段代码,主要有这几个bug:

  1. HTML标签转义错了:你用&lt;和&gt;代替了<和>,这是在HTML文档里写特殊字符才需要的转义,在JavaScript字符串里直接写<和>就行!写&lt;的话,浏览器会把它当成纯文本显示,根本不会渲染成标签,菜单自然出不来。

  2. 根域名提取错了:你用arrLinks[i]["split"]("//")[1]拿到的是//后面的全部内容,包括路径!比如https://www.example.com/12xy45会得到www.example.com/12xy45,这显然不是你要的根域名,得用上面的getRootDomain函数来提取正确的域名。

  3. 写法不够规范:arrLinks[i]["split"]("//")虽然语法上没问题,但大家一般都会写成arrLinks[i].split("//"),可读性更好,也符合JS的常规写法。

修复后的代码

把这些问题都改了之后,代码应该就能正常跑了:

// 先把获取根域名的函数写上
function getRootDomain(url) {
  const urlObj = new URL(url);
  let hostname = urlObj.hostname;
  if (hostname.startsWith('www.')) {
    hostname = hostname.slice(4);
  }
  return hostname;
}

// 假设arrLinks是你的URL数组,tempLink对应每个URL的域名(用来拿favicon)
for (let i = 0; i < arrLinks.length; i++) {
  const currentUrl = arrLinks[i];
  const rootDomain = getRootDomain(currentUrl);
  // 确保favicon用的是根域名
  const faviconSrc = `https://www.google.com/s2/favicons?domain=${getRootDomain(tempLink)}`;
  // 直接写正常的HTML标签就行,不用转义
  const menuItem = `<ul class='myClassId'><li><a href='${currentUrl}'><img src='${faviconSrc}'/>${rootDomain}<i class='fa fa-angle-right'></i></a></li></ul>`;
  $("#divMenu").append(menuItem);
}

这样改完之后,菜单会正确渲染,显示的文本也是干净的根域名啦~

内容的提问来源于stack exchange,提问作者Octavia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:18:29