2013-05-10 14 views
13

Il codice:Ottenere nome di dominio di un URL in C#/.NET

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

mi dà "subdomain.website.com"

Ma ho bisogno del dominio principale "website.com" per qualsiasi url o collegamento web.

Come faccio?

+2

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

+0

In realtà si vuole dominio di primo livello. subdomain.website.com è il dominio e website.com è il dominio di primo livello. – ysrb

+0

Questa stringa non è molto difficile da analizzare. Hai provato qualche semplice combinazione di '.Split' e' string.Join'? –

risposta

15

Si può fare questo per ottenere solo gli ultimi due segmenti del nome host:

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

O questo:

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

Questo metodo troverà includere almeno due nome di dominio parti, ma includerà anche parti intermedie di due caratteri o meno:

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); 

Questo gestirà domini come localhost, example.com e example.co.uk. Non è il metodo migliore, ma almeno ti salva dalla costruzione di una lista gigantesca di domini di primo livello.

+0

Penso che la seconda soluzione non ha funzionato correttamente. ** E penso che dovremmo anche prendere in considerazione alcuni URL come www.google.co.uk che il nome di dominio principale contiene più di uno '.' ** – 2power10

+2

@imJustice Grazie, ho risolto la seconda soluzione. Ho anche aggiunto una soluzione abbastanza grezza per gestire i TLD multi-parte. –

+0

Il terzo metodo genera un'eccezione 'L'indice era fuori intervallo 'se la penultima parte del dominio come (' t' in 't.co' e' goo' in 'goo.gl') è più corta di 3 caratteri. Si prega di risolvere questo problema, sto usando questo codice come metodo di estensione. – shashwat

3

Prova l'espressione regolare?

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

Meglio trattare le espressioni regolari come lingua straniera (per i lettori) e spiegare perché il tuo modello risolve il problema. –

+2

Cosa succede se .org? – as9876

4

Puoi provare questo. Questo può gestire molti tipi di dominio di root se lo si definisce in un array.

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 Hai ragione, cambia per utilizzare invece EndSwith. – 2power10

+0

+1 questa è una buona soluzione. –

Problemi correlati