仅 JavaScript 正则表达式 URL 提取域

标签 javascript regex

目前我可以使用以下正则表达式从任何 URL 中提取“域”:

/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n\?\=]+)/im

但是我也得到了我想避免的子域。例如,如果我有网站:

  • www.google.com
  • yahoo.com/something
  • freds.meatmarket.co.uk?someparameter
  • josh.meatmarket.co.uk/asldf/asdf

我目前得到:

  • google.com
  • yahoo.com
  • freds.meatmarket.co.uk
  • josh.meatmarket.co.uk

最后两个我想排除 fredsjosh 子域部分,只提取真正的域,即 meatmarket.co.uk.

我确实找到了另一个试图用 PHP 解决的 SOF,不幸的是我不懂 PHP。这可以翻译成 JS(我实际上使用的是 Google Script 仅供引用)吗?

  function topDomainFromURL($url) {
    $url_parts = parse_url($url);
    $domain_parts = explode('.', $url_parts['host']);
    if (strlen(end($domain_parts)) == 2 ) { 
      // ccTLD here, get last three parts
      $top_domain_parts = array_slice($domain_parts, -3);
    } else {
      $top_domain_parts = array_slice($domain_parts, -2);
    }
    $top_domain = implode('.', $top_domain_parts);
    return $top_domain;
  }

最佳答案

那么,您需要从结果中删除最前面的主机名,除非已经只有两个部分了吗?

只需使用匹配该条件的正则表达式对第一次匹配的结果进行后处理:

function domain_from_url(url) {
    var result
    var match
    if (match = url.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n\?\=]+)/im)) {
        result = match[1]
        if (match = result.match(/^[^\.]+\.(.+\..+)$/)) {
            result = match[1]
        }
    }
    return result
}

console.log(domain_from_url("www.google.com"))
console.log(domain_from_url("yahoo.com/something"))
console.log(domain_from_url("freds.meatmarket.co.uk?someparameter"))
console.log(domain_from_url("josh.meatmarket.co.uk/asldf/asdf"))

// google.com
// yahoo.com
// meatmarket.co.uk
// meatmarket.co.uk

关于仅 JavaScript 正则表达式 URL 提取域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818020/

相关文章:

javascript - 设置后 scrollTop 值立即变化

javascript - 如何找到至少两个不相邻的字母对

c# - 正则表达式 "Full Name"到 "Abbreviated Name"

Javascript Lookbehind 与全局搜索重叠

javascript - 替换 HTML 表格中的值?

javascript - 引用错误 : io is not defined in NodeJS

php - 通过标签中的 id 属性将值传递给 javascript/JQuery 是常见的做法吗?安全吗?

javascript - 在firefox浏览器中,Window.open点击后奇怪显示[object Window]

python - re.sub() 不替换表达式中的值

java - 使用 UNICODE_CHARACTER_CLASS 标志时不同的 Java 正则表达式匹配行为