2013-05-10 18 views
13

kodu:Uzyskaj nazwę domeny z URL w C#/.NET

string sURL = "http://subdomain.website.com/index.htm"; 
MessageBox.Show(new System.Uri(sURL).Host); 

daje mi "subdomain.website.com"

Ale muszę główną domenę "website.com" Dla każdego adres URL lub link do strony internetowej.

Jak to zrobić?

+2

podobne do http://stackoverflow.com/questions/4643227/top-level-domain-from-url-in-c-sharp – ysrb

+0

Właściwie chcesz domenę najwyższego poziomu. poddomena.website.com to domena, a witryna witryny to najwyższy poziom. – ysrb

+0

To naprawdę nie jest bardzo trudny ciąg do przeanalizowania. Czy próbowałeś już prostej kombinacji '.Split' i' string.Join'? –

Odpowiedz

15

Można to zrobić, aby dostać zaledwie dwa ostatnie segmenty nazwa hosta:

string[] hostParts = new System.Uri(sURL).Host.Split('.'); 
string domain = String.Join(".", hostParts.Skip(Math.Max(0, hostParts.Length - 2)).Take(2)); 

albo to:

var host = new System.Uri(sURL).Host; 
var domain = host.Substring(host.LastIndexOf('.', host.LastIndexOf('.') - 1) + 1); 

Metoda ta znajdzie zawierać co najmniej dwie nazwy domeny części, ale będą również zawierać części pośrednie składające się z dwóch znaków lub mniej:

var host = new System.Uri(sURL).Host; 
int index = host.LastIndexOf('.'), last = 3; 
while (index > 0 && index >= last - 3) 
{ 
    last = index; 
    index = host.LastIndexOf('.', last - 1); 
} 
var domain = host.Substring(index + 1); 

To będzie obsługiwać domeny, takie jak localhost, example.com i example.co.uk. To nie jest najlepsza metoda, ale przynajmniej oszczędza ci ona od zbudowania olbrzymiej listy domen najwyższego poziomu.

+0

Myślę, że drugie rozwiązanie nie działa poprawnie. ** I myślę, że powinniśmy również rozważyć niektóre adresy URL, takie jak www.google.co.uk, których nazwa domeny root zawiera więcej niż jeden. ** – 2power10

+2

@imJustice Dzięki, poprawiłem drugie rozwiązanie. Dodałem także dość proste rozwiązanie do obsługi wieloczęściowych TLD. –

+0

Trzecia metoda polega na wyrzuceniu wyjątku "Indeks był poza zakresem", jeśli druga część ostatniej domeny ('t' w' t.co' i 'goo' w' goo.gl') jest krótsza niż 3 znaki. Napraw to, używam tego kodu jako metody rozszerzenia. – shashwat

3

Spróbuj wyrażeń regularnych?

using System.Text.RegularExpressions; 

string sURL = "http://subdomain.website.com/index.htm"; 
string sPattern = @"\w+.com"; 

// Instantiate the regular expression object. 
Regex r = new Regex(sPattern, RegexOptions.IgnoreCase); 

// Match the regular expression pattern against a text string. 
Match m = r.Match(sUrl); 
if (m.Success) 
{ 
    MessageBox.Show(m.Value); 
} 
+4

Najlepiej traktować wyrażenia regularne jako język obcy (dla czytelników) i wyjaśnić, dlaczego wzór rozwiązuje problem. –

+2

Co jeśli to jest .org? – as9876

4

Możesz spróbować. To może obsłużyć wiele rodzajów domeny root, jeśli zdefiniujesz ją w tablicy.

string sURL = "http://subdomain.website.com/index.htm"; 
var host = new System.Uri(sURL).Host.ToLower(); 

string[] col = { ".com", ".cn", ".co.uk"/*all needed domain in lower case*/ }; 
foreach (string name in col) 
{ 
    if (host.EndsWith(name)) 
    { 
     int idx = host.IndexOf(name); 
     int sec = host.Substring(0, idx - 1).LastIndexOf('.'); 
     var rootDomain = host.Substring(sec + 1); 
    } 
} 
+0

@ p.s.w.g Masz rację, zamiast tego zmień na EndsWith. – 2power10

+0

+1 to także dobre rozwiązanie. –