JavaScript Regex URL仅提取域

Mar*_*kII 6 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 FYI)吗?

  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;
  }
Run Code Online (Sandbox Code Playgroud)

Ole*_*kov 13

那么,除非只有两个部分,否则你需要从结果中删除第一个主机名?

只需对匹配该条件的regexp进行第一次匹配后处理结果:

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
Run Code Online (Sandbox Code Playgroud)

  • 这并不像宣传的那样工作。`readDomain('https://www.ebay.com/sh/ord') -> "ebay.com"` 和 `readDomain('https://www.ebay.co.uk/sh/ord') - > “co.uk”` (4认同)