2013-05-10 81 views
13

代碼:獲取域名在C#中的URL/.NET

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

給我 「subdomain.website.com」

但我需要任何的主域名 「website.com」網址或網頁鏈接。

我該怎麼做?

+2

到http://stackoverflow.com/questions/4643227/top-level-domain-from-url-in-c-sharp – ysrb 2013-05-10 01:35:17

+0

類似其實你想要的頂級域名。 subdomain.website.com是域名,website.com是頂級域名。 – ysrb 2013-05-10 01:35:54

+0

這真的不是一個很難解析的字符串。你是否嘗試過'.Split'和'string.Join'的簡單組合? – 2013-05-10 01:48:54

回答

15

你可以做到這一點得到公正的主機名的最後兩段:

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

或者這樣:

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

這種方法就可以找到包括至少兩個域名部件,但也包括兩個字符或更少的中間部分:

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

這將處理域名,如localhost,example.comexample.co.uk。這不是最好的方法,但至少可以讓您免於構建一個巨大的頂級域名列表。

+0

我認爲第二個解決方案無法正常工作。 **我認爲我們還應該考慮一些網址,例如www.google.co.uk根域名包含多個'。'** – 2power10 2013-05-10 07:00:27

+2

@imJustice謝謝,我修復了第二個解決方案。我還添加了一個相當簡單的解決方案來處理多部分頂級域名。 – 2013-05-10 07:36:27

+0

如果域的後半部分(如't.co'中的't'和'goo.gl'中的'goo')小於3個字符,則第三種方法會拋出'索引超出範圍'異常。請修復此問題,我將此代碼用作擴展方法。 – shashwat 2013-06-24 18:38:55

3

請嘗試正則表達式?

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

最好將正則表達式作爲外語處理(給讀者)並解釋爲什麼你的模式能夠解決這個問題。 – 2013-05-10 02:00:14

+2

如果它是.org怎麼辦? – as9876 2015-11-08 20:06:38

4

你可以試試這個。如果您在數組中定義它,它可以處理多種根域。

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您說得對,改爲使用EndsWith。 – 2power10 2013-05-10 07:45:33

+0

+1這是一個很好的解決方案。 – 2013-05-10 07:49:35