1

我有一个我需要过滤特定域和子域的 url 列表。说我有一些域名,比如

http://www.example.com
http://test.example.com
http://test2.example.com

我需要从域 example.com 中提取 url。

4

2 回答 2

2

我了解您可能正在寻找使用 URL 类或其他东西的奇特解决方案,但这不是必需的。只需想一种从每个 url 中提取“example.com”的方法。

注意:example.com 与 example.net 本质上是不同的域。因此,仅提取“示例”在技术上是错误的做法。

我们可以划分一个示例 url 说:

http://sub.example.com/page1.html

第 1 步:使用分隔符“/”拆分 url,以提取包含域的部分。

每个这样的部分都可以以以下块的形式查看(可能为空)

[www][subdomain][basedomain]

第 2 步:丢弃“www”(如果存在)。我们剩下 [subdomain] [basedomain]

第 3 步:使用分隔符“.”分割字符串

第 4 步:查找拆分生成的字符串总数。如果有 2 个字符串,它们都是目标域(example 和 com)。如果有 >=3 个字符串,则获取最后 3 个字符串。如果最后一个字符串的长度为 3,则最后 2 个字符串构成域(example 和 com)。如果最后一个字符串的长度为 2,则最后 3 个字符串组成域(example 和 co 和 uk)

我认为这应该可以解决问题(我希望这不是家庭作业:D)

    //You may clean this method to make it more optimum / better
    private String getRootDomain(String url){
         String[] domainKeys = url.split("/")[2].split("\\.");
             int length = domainKeys.length;
             int dummy = domainKeys[0].equals("www")?1:0;
             if(length-dummy == 2) 
                  return domainKeys[length-2] + "." + domainKeys[length-1];
             else{
                  if(domainKeys[length-1].length == 2) {
                       return domainKeys[length-3] + "." + domainKeys[length-2] + "." + domainKeys[length-1];
                  }
                  else{
                       return domainKeys[length-2] + "." + domainKeys[length-1];
                  }       
             }

    }
于 2012-06-18T17:56:22.673 回答
2

处理需要我确定两个 URL 是否来自同一个子域的项目(即使存在嵌套域)。我从上面的指南中进行了修改。到目前为止,这很好:

public static boolean isOneSubdomainOfTheOther(String a, String b) {

        try {
            URL first = new URL(a);
            String firstHost = first.getHost();
            firstHost = firstHost.startsWith("www.") ? firstHost.substring(4) : firstHost;

            URL second = new URL(b);
            String secondHost = second.getHost();
            secondHost = secondHost.startsWith("www.") ? secondHost.substring(4) : secondHost;

            /*
             Test if one is a substring of the other
             */           
            if (firstHost.contains(secondHost) || secondHost.contains(firstHost)) {

                String[] firstPieces = firstHost.split("\\.");
                String[] secondPieces = secondHost.split("\\.");

                String[] longerHost = {""};
                String[] shorterHost = {""};

                if (firstPieces.length >= secondPieces.length) {
                    longerHost = firstPieces;
                    shorterHost = secondPieces;
                } else {
                    longerHost = secondPieces;
                    shorterHost = firstPieces;
                }
                //int longLength = longURL.length;
                int minLength = shorterHost.length;
                int i = 1;

                /*
                 Compare from the tail of both host and work backwards
                 */
                while (minLength > 0) {
                    String tail1 = longerHost[longerHost.length - i];
                    String tail2 = shorterHost[shorterHost.length - i];

                    if (tail1.equalsIgnoreCase(tail2)) {
                        //move up one place to the left
                        minLength--;
                    } else {
                        //domains do not match
                        return false;
                    }
                    i++;
                }
                if (minLength == 0) //shorter host exhausted. Is a sub domain
                    return true;
            }
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
        return false;
    }

图我把它留在这里,以备将来参考类似的问题。

于 2016-04-29T21:40:24.147 回答