【问题标题】:Javascript/Regex for finding just the root domain name without sub domainsJavascript/Regex 仅查找没有子域的根域名
【发布时间】:2020-06-24 00:23:47
【问题描述】:

我进行了搜索,发现了很多类似的正则表达式示例,但并不是我需要的。

我希望能够传入以下网址并返回结果:

  • www.google.com 返回 google.com

  • sub.domains.are.cool.google.com 返回 google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com 返回 google.com

  • sub.domain.google.com/no/thanks 返回 google.com

希望这是有道理的 :) 提前致谢!-James

【问题讨论】:

  • sub.domain.google.co.uk 的结果是什么?
  • 这些不是 URL,而只是域名(除了最后一个字符串,可以解释为域名加 URL 路径)。
  • @pekka "google.co.uk" 就像 apps.facebook.com 返回 facebook.com 一样。 @gumbo 这是正确的。它们只是可以传入的示例。主要是完整的 url(子域、域、文件夹、文件)。
  • 请务必查看publicsuffix.org 的公共后缀列表。
  • @pekka 是的,这就是困难的地方,如果可能的话,我想包括这些域。

标签: javascript regex dns


【解决方案1】:

你不能用正则表达式来做到这一点,因为你不知道后缀中有多少块。

例如 google.com 后缀为 com。要从 subdomain.google.comgoogle.com,您必须使用最后两个块 - 一个用于后缀,一个用于 google强>。

如果您将此逻辑应用于 subdomain.google.co.uk,但您最终会得到 co.uk

您实际上需要从 http://publicsuffix.org/ 之类的列表中查找后缀

【讨论】:

    【解决方案2】:

    不要使用正则表达式,使用 .split() 方法并从那里开始工作。

    var s = domain.split('.');
    

    如果您的用例相当狭窄,您可以根据需要检查 TLD,然后根据需要返回最后 2 或 3 个段:

    return s.slice(-2).join('.');
    

    与任何正则表达式解决方案相比,它会让您的眼睛流血更少。

    【讨论】:

      【解决方案3】:

      我没有对此进行大量测试,但是如果我了解您的要求,这应该是一个不错的起点...

      ([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b
      

      编辑:

      为了澄清,它正在寻找:

      一个或多个字母数字字符或破折号,后跟一个文字点

      然后是三件事之一......

      1. 三个或更多字母字符(即 com/net/mil/coop 等)
      2. 两个字母字符,后跟一个文字点,再跟两个字母(即 co.uk)
      3. 两个字母字符(即 us/uk/to 等)

      最后,单词边界 (\b) 表示字符串的结尾、空格或非单词字符(在正则表达式中,单词字符通常是字母数字和下划线)。

      正如我所说,我没有做太多测试,但这似乎是一个合理的起点。您可能需要尝试并对其进行一些调整,即使这样,您也不太可能获得 100% 的所有测试用例。有一些考虑因素,比如 Unicode 域名和各种技术上有效但你可能不会在野外遇到的事情会绊倒像这样的简单正则表达式,但这可能会得到您已经完成了 90% 以上的路程。

      【讨论】:

      • 您能解释一下它的作用吗,我对正则表达式的了解很少。以及如何实施。
      • 90% 是慷慨的。基本上,没有简单的方法可以做到这一点。域名系统太复杂了,变化很大。
      • 鉴于所提供的示例是“正常”外观的域,我认为您可能会遇到很大一部分问题,但可以肯定的是,可能不是 90%。正如我所说的那样(而且非常重要),您不太可能获得所有测试用例的 100%。
      【解决方案4】:

      如果您的数据子集有限,我建议保持正则表达式简单,例如

      (([a-z\-]+)(?:\.com|\.fr|\.co.uk))
      

      这将匹配:

      www.google.com --> google.com
      www.google.co.uk --> google.co.uk
      www.foo-bar.com --> foo-bar.com
      

      就我而言,我知道所有相关的 URL 都将使用这个正则表达式进行匹配。

      收集样本数据集并根据您的正则表达式对其进行测试。在制作原型时,您可以使用https://regex101.com/r/aG9uT0/1 之类的工具来完成。在开发中,使用测试脚本将其自动化。

      【讨论】:

        【解决方案5】:

        没有测试顶级域的有效性,我正在使用 Stormsweeper 解决方案的改编版:

        domain = 'sub.domains.are.cool.google.com'
        
        s = domain.split('.')
        
        tld = s.slice(-2..-1).join('.')
        

        编辑:小心三部分 TLD 的问题,例如 domain.co.uk。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-27
          • 2018-07-06
          • 1970-01-01
          • 1970-01-01
          • 2015-05-25
          • 2012-11-02
          • 2013-01-02
          相关资源
          最近更新 更多