1

特定のドメインとサブドメインをフィルタリングするために必要な URL のリストがあります。次のようなドメインがあるとします

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

ドメイン example.com から URL を抽出する必要があります。

4

2 に答える 2

2

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 に答える
2

URL クラスなどを使用した高度なソリューションを探していると思いますが、必須ではありません。それぞれの URL から「example.com」を抽出する方法を考えてみてください。

注: example.com は、基本的に example.net とは異なるドメインです。したがって、「例」だけを抽出することは技術的に間違っています。

サンプル URL を次のように分割できます。

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

ステップ 1 : URL を区切り文字「/」で分割して、ドメインを含む部分を抽出します。

そのような各部分は、次のブロックの形式で見ることができます(空の場合があります)

[www][subdomain][basedomain]

ステップ 2: 「www」を破棄します (存在する場合)。[サブドメイン][ベースドメイン]が残ります

ステップ 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 に答える