2012-05-24 116 views
5

客戶可以從域名輸入網站。他們也可以從他們的聯繫人進入女王。解析域名/主機名字符串

知道我們需要找到哪些websited whoose域可以關聯到mailadresses的域的客戶。

所以我的想法是從webadress並從URL中提取的主機,並比較他們

那麼什麼是最可靠的算法得到從URL的主機名?

例如主機可以是:

foo.com 
www.foo.com 
http://foo.com 
https://foo.com 
https://www.foo.com 

結果應始終foo.com

+0

沒錯,我的錯誤 –

+0

澄清一點的,因爲你與.vu TLD刪除的例子,你說你只關心.COM頂級域名或者這是一個過於簡單化? –

+0

這簡直太簡單了。它可以是任何類型的頂級域名,.de .eu .biz ..... 重要的要求是通過查看網站的URL找到可能的候選人匹配mailadresses –

回答

10

而不是依靠不可靠的正則表達式使用System.Uri做解析爲您服務。使用這樣的代碼:

string uriStr = "www.foo.com"; 
if (!uriStr.Contains(Uri.SchemeDelimiter)) { 
    uriStr = string.Concat(Uri.UriSchemeHttp, Uri.SchemeDelimiter, uriStr); 
} 
Uri uri = new Uri(uriStr); 
string domain = uri.Host; // will return www.foo.com 

我們得到公正的頂級域名,你可以使用:

string tld = uri.GetLeftPart(UriPartial.Authority); // will return foo.com 
+1

不應該導致只是「com」? – mikesjawnbit

+2

@anubhava:uri.GetLeftPart(UriPartial.Authority)不返回根域名。相反,它會返回URL的整個左側部分,從方案開始到端口結束(如果指定)。 AFAIK,忽略主機的子域部分的唯一方法是使用2-pass調用將其明確截斷爲string.LastIndexOf()。 –

+0

請更新answer.string tld不返回根目錄。 – LikePod

1

這裏有一個正則表達式匹配的URL的您提供。基本上http和https等是可選的,就像www一樣,然後匹配到一個可能的路徑;

var expression = /(https?:\/\/)?(www\.)?([^\/]*)(\/.*)?$/; 

這將意味着;

var result = 'https://www.foo.com.vu/blah'.replace(expression, '$3') 

將評估爲

result === 'foo.com.vu' 
+0

問題是關於子域的問題。我認爲他們不應該被包括在結果中。所以product.mycompany.com應該最終在mycompany.com –

+1

這可能是相當困難的,因爲你無法數點點子域名(我想我想說的是像.co.uk會搞砸了)。您可能必須執行兩次檢查,一次使用上面的表達式,另一次使用第一個點之前的char字符串 – cmilhench

+0

如果您使用無效字符(例如'a!notit.com')評估DNS名稱,則此答案將失敗。 ,或者字符太多(超過63個)的 –