【问题标题】:Parse Out Root Domain Using RegEx & Pre-Determined List of TLD's使用 RegEx 和预先确定的 TLD 列表解析根域
【发布时间】:2011-12-16 16:29:38
【问题描述】:

我想使用正则表达式来解析给定输入 URL 的根域。我已经知道,在给定适当的输入 URL 的情况下,基本上没有 RegEx 不能被“破坏”,这就是为什么我想将给定 RegEx 的使用限制在给定 TLD 列表的原因(如果可能的话)。这是一个例子:

假设我有一个输入文件,将通过正则表达式一次运行文件中的每个 URL。这是输入文件:

www.google.co.uk
www.google.co.uk/something
www.google.com/
www.google.com/something
google.com/
google.com/something
subdomain.google.com/
subdomain.google.com/something
www.subdomain.google.com/
www.google.net/
www.google.net/something
google.net/

最后的结果,应该是这样的:

google.co.uk
google.co.uk
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com

我想要的重要一点是,正则表达式可以根据以下内容进行解析:

从给定的 TLD 列表中找到给定 URL 中的 TLD(例如:

(co.uk|com|net|edu|gov|etc|etc|etc)

如果找到给定的 TLD 之一,则匹配并解析它找到的 TLD 左侧(包括)的所有内容,直到它到达行首或到达另一个“。”

如果可以根据给出的“伪代码”描述编写一个匹配的正则表达式,它应该准确地解析出示例输入数据。

【问题讨论】:

  • 你用的是什么框架?许多人已经内置了处理 url 的工具。
  • 出于所有意图和目的,我只想说我坚持使用纯正则表达式解决方案。想象一下,您必须使用 PHP preg_match 和正则表达式来执行我上面描述的操作,而您就是我所在的位置。

标签: regex dns text-parsing


【解决方案1】:
perl -ne 'print $2, "\n" if m-^([^/]+?\.|)([^./]*\.(co\.uk|com|net|edu|gov|etc|etc|etc))(/.*|)$-'  /tmp/x.txt

似乎给出了您正在寻找的结果,至少在您提供的示例数据上(假设您不想将 google.net 翻译成 google.com)。

请注意,我的 [^./] 确实有点懒惰,它可以匹配域名中不合法的字符。话又说回来,i18n 可能重写了 DNS 的规则,以包含比我年轻时更多的字符。

【讨论】:

    【解决方案2】:

    在 Java 中:

    package test;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            String subject = "www.google.co.uk\nwww.google.co.uk/something\nwww.google.com/\nwww.google.com/something\ngoogle.com/\ngoogle.com/something\nsubdomain.google.com/\nsubdomain.google.com/something\nwww.subdomain.google.com/\nwww.google.net/\nwww.google.net/something\ngoogle.net/\n";
            Pattern pattern = Pattern.compile("(\\w+)\\.(co.uk|com|net|edu|gov)");
    
            Matcher m = pattern.matcher(subject);
            int count = 0;
               while(m.find()) {
                   count++;
                   System.out.println(m.group());
              }
        }
    }
    

    正则表达式 = (\w+)\.(co.uk|com|net|edu|gov)

    【讨论】:

      【解决方案3】:

      实际上,由于很多原因,无法使用正则表达式解析 uri。例如localhost、192.168.0.43、www.google.co.uk都有效。

      但是,如果您提取“.”之前的最后一个元素,您不希望将 IP 地址中的“43”作为 TLD,有很多例外情况(co.uk 和 bl.uk 有两种不同的行为)。

      我在那里编写了一个 C 库/Python 绑定和命令行工具:http://www.github.com/stricaud/faup,因此您可以执行以下操作:

      $ faup -p www.example.com
      scheme,credential,subdomain,domain,host,tld,port,resource_path,query_string,fragment
      ,,www,example.com,www.example.com,com,,,,
      

      要获取域,您可以拥有一个包含所有域的文件,并通过 faup 运行它:

      $ cat urls.txt |faup -f domain
      google.co.uk
      google.co.uk
      google.com
      google.com
      google.com
      google.com
      google.com
      google.com
      google.com
      google.net
      google.net
      google.net
      

      如果只想要tld,可以使用-f tld参数,如:

      $ faup -f tld www.example.com
      com
      

      甚至,得到一个 json 输出:

      $ faup -o json http://www.test.co.uk/index.html?foo=bar#tagada
      {
          "scheme": "http",
          "credential": "",
          "subdomain": "www",
          "domain": "test.co.uk",
          "host": "www.test.co.uk",
          "tld": "co.uk",
          "port": "",
          "resource_path": "/index.html",
          "query_string": "?foo=bar",
          "fragment": "#tagada"
      }
      

      这不仅比正则表达式更快,而且可以处理您遇到的所有特定情况,只要您想在此处执行像域/tld 提取这样简单的事情。

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 2012-05-11
        相关资源
        最近更新 更多