web-dev-qa-db-ja.com

URLからドメイン名のみを取得しますか?

URL文字列からドメイン名のみを抽出しようとしています。私はそれをほとんど持っています...私はURIを使用しています

文字列があります。最初の考えは正規表現を使用することでしたが、その後、URIクラスを使用することにしました

http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAgQFjAA&url=http://www.test.com/&rct=j&q=test&ei=G2phS -HdJJWTjAfckvHJDA&usg = AFQjCNFSEAztaqtkaIvEzxmRm2uOARn1kQ

上記をgoogle.comとgoogleに変換する必要があります。wwwなしで

私は次のことをしました

Uri test = new Uri(referrer);
log.Info("Domain part : " + test.Host);

基本的に、これはwww.google.comを返します....可能であれば、2つのフォームを返してください...前述のように...

google.comおよびgoogle

これはURIで可能ですか?

33
mark smith

はい、使用可能です:

Uri.GetLeftPart( UriPartial.Authority )
28
Dewfy

@Dewfy:欠陥は、メソッドが「www.test.co.uk」に対して「uk」を返すことですが、ここのドメインは明らかに「test.co.uk」です。

@naivists:欠陥は、メソッドが「www.beta.Microsoft.com」に対して「beta.Microsoft.com」を返すことですが、ここのドメインは明らかに「Microsoft.com」です

同じものが必要だったので、コピーしてソリューションに貼り付けることができるクラスを作成しました。ハードコードされたtldの文字列配列を使用します。 http://Pastebin.com/raw.php?i=VY3DCNhp

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.Microsoft.com/path/page.htm"));

出力Microsoft.com

そして

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.Microsoft.co.uk/path/page.htm"));

出力Microsoft.co.uk

17
servermanfail

google.comはwww.google.comと同じであるとは限りません(この例では技術的には同じですが、そうでない場合もあります)。

多分あなたが必要なのは、実際に「トップレベル」ドメインと「www」subodmainを削除することですか?それからsplit('.')だけで、最後の部分の前の部分を取ります!

6
naivists

私はほとんどすべてのアプローチを試みましたが、それらはすべて望ましい結果に達しませんでした。それで、servermanfailから調整された私のアプローチです。

Tldファイルは https://publicsuffix.org/list/ から入手できます。 https://publicsuffix.org/list/effective_tld_names.dat parseからファイルを取得しましたそれとtldを検索します。新しいtldが公開されている場合は、最新のファイルをダウンロードしてください。

楽しんで。

using System;
using System.Collections.Generic;
using System.IO;

namespace SearchWebsite
{
internal class NetDomain
{
    static public string GetDomainFromUrl(string Url)
    {
        return GetDomainFromUrl(new Uri(Url));
    }

    static public string GetDomainFromUrl(string Url, bool Strict)
    {
        return GetDomainFromUrl(new Uri(Url), Strict);
    }

    static public string GetDomainFromUrl(Uri Url)
    {
        return GetDomainFromUrl(Url, false);
    }

    static public string GetDomainFromUrl(Uri Url, bool Strict)
    {
        initializeTLD();
        if (Url == null) return null;
        var dotBits = Url.Host.Split('.');
        if (dotBits.Length == 1) return Url.Host; //eg http://localhost/blah.php = "localhost"
        if (dotBits.Length == 2) return Url.Host; //eg http://blah.co/blah.php = "localhost"
        string bestMatch = "";
        foreach (var tld in DOMAINS)
        {
            if (Url.Host.EndsWith(tld, StringComparison.InvariantCultureIgnoreCase))
            {
                if (tld.Length > bestMatch.Length) bestMatch = tld;
            }
        }
        if (string.IsNullOrEmpty(bestMatch))
            return Url.Host; //eg http://domain.com/blah = "domain.com"

        //add the domain name onto tld
        string[] bestBits = bestMatch.Split('.');
        string[] inputBits = Url.Host.Split('.');
        int getLastBits = bestBits.Length + 1;
        bestMatch = "";
        for (int c = inputBits.Length - getLastBits; c < inputBits.Length; c++)
        {
            if (bestMatch.Length > 0) bestMatch += ".";
            bestMatch += inputBits[c];
        }
        return bestMatch;
    }


    static private void initializeTLD()
    {
        if (DOMAINS.Count > 0) return;

        string line;
        StreamReader reader = File.OpenText("effective_tld_names.dat");
        while ((line = reader.ReadLine()) != null)
        {
            if (!string.IsNullOrEmpty(line) && !line.StartsWith("//"))
            {
                DOMAINS.Add(line);
            }
        }
        reader.Close();
    }


    // This file was taken from https://publicsuffix.org/list/effective_tld_names.dat

    static public List<String> DOMAINS = new List<String>();
}

}

5
Cedi P

以下は、SLDとgTLDまたはccTLD拡張のみを提供するコードです(以下の例外に注意してください)。 DNSは気にしません。

理論は次のとおりです。

  • 3トークン未満のものはそのまま残ります。 「localhost」、「domain.com」、その他:最後のトークンはgTLDまたはccTLD拡張である必要があります。
  • 最後から2番目のトークンは、長さが<3 OR例外のリストに含まれている場合、拡張の一部と見なされます。
  • 最後に、その前のトークンはSLDと見なされます。それより前のものは、サブドメインまたはホスト修飾子と見なされます。わー.

コードに関しては、短くて甘い:

private static string GetDomainName(string url)
{
    string domain = new Uri(url).DnsSafeHost.ToLower();
    var tokens = domain.Split('.');
    if (tokens.Length > 2)
    {
        //Add only second level exceptions to the < 3 rule here
        string[] exceptions = { "info", "firm", "name", "com", "biz", "gen", "ltd", "web", "net", "pro", "org" }; 
        var validTokens = 2 + ((tokens[tokens.Length - 2].Length < 3 || exceptions.Contains(tokens[tokens.Length - 2])) ? 1 : 0);
        domain = string.Join(".", tokens, tokens.Length - validTokens, validTokens);
    }
    return domain;
}

明らかな例外は、これが2文字のドメイン名を処理しないことです。したがって、ab.comを所有できるほど幸運である場合は、コードを少し調整する必要があります。私たちにとっては、このコードはほとんどすべてのgTLDとccTLDから非常にエキゾチックなものを除いたものです。

5
anoordende

最近のR#Strahlのブログを参照してください。C#および.netを中心としたリファレンスです。

ASP.NETパスの意味を理解する

3

「ドメイン名」を構成するものの誤解を表示していると思います-一般的な使用法では「純粋なドメイン名」などはありません-これは、一貫した結果が必要な場合に定義する必要があるものです。
「www」部分だけを削除しますか?そして、トップレベルドメインを削除する別のバージョンがあります(たとえば、「。com」または「.co.uk」などの部分を削除しますか?)別の答えはsplit( "。")に言及しています-あなたは何かを使用する必要がありますこのように、ホスト名の特定の部分を手動で除外したい場合、.NETフレームワーク内に要件を正確に満たすものは何もありません。これらを自分で実装する必要があります。

3
David_001

私は以下の解決策を考え出しました(Linqを使用):

    public string MainDomainFromHost(string Host)
    {
        string[] parts = Host.Split('.');
        if (parts.Length <= 2)
            return Host; // Host is probably already a main domain
        if (parts[parts.Length - 1].All(char.IsNumber))
            return Host; // Host is probably an IPV4 address
        if (parts[parts.Length - 1].Length == 2 && parts[parts.Length - 2].Length == 2)
            return string.Join(".", parts.TakeLast(3)); // this is the case for co.uk, co.in, etc...
        return string.Join(".", parts.TakeLast(2)); // all others, take only the last 2
    }
1
Paul Peeters

Uriのホストは、ラベル(www)とトップレベルドメイン(com)を含むドメイン(www.google.com)を常に返します。しかし、多くの場合、中間ビットを抽出する必要があります。ただやる

Uri uri;
bool result = Uri.TryCreate(returnUri, UriKind.Absolute, out uri);
if (result == false)
    return false;

//if you are sure it's not "localhost"
string domainParts = uri.Host.Split('.');
string topLevel = domainParts[domainParts.Length - 1]
string hostBody = domainParts[domainParts.Length - 2]
string label = domainParts[domainParts.Length - 3]

ただし、指定されたURIは「google.com」のようなものであることが多いため、domainParts.lengthを確認する必要があります。

1
Andy

はい、iveはソリューションをここに投稿しました: http://Pastebin.com/raw.php?i=raxNQkCF

拡張機能を削除する場合は、追加するだけです

if (url.indexof(".")>-1) {url = url.substring(0, url.indexof("."))}

1
maxp

Nager.PublicSuffixを使用する

install-package Nager.PublicSuffix

var domainParser = new DomainParser(new WebTldRuleProvider());

var domainName = domainParser.Get("sub.test.co.uk");
//domainName.Domain = "test";
//domainName.Hostname = "sub.test.co.uk";
//domainName.RegistrableDomain = "test.co.uk";
//domainName.SubDomain = "sub";
//domainName.TLD = "co.uk";
1
Toolkit