2012-09-12 61 views
1

我想從使用.NET的有效網址過濾出無效的網址。如何檢查一個網址是否有效

我正在使用Uri.TryCreate()方法。

它的語法如下

public static bool TryCreate(Uri baseUri,string relativeUri,out Uri result) 

我現在做這個....

Uri uri = null; 

var domainList = new List<string>(); 
domainList.Add("asas"); 
domainList.Add("www.stackoverflow.com"); 
domainList.Add("www.codera.org"); 
domainList.Add("www.joker.testtest"); 
domainList.Add("about.me"); 
domainList.Add("www.ma.tt"); 

var correctList = new List<string>(); 

foreach (var item in domainList) 
{ 
    if(Uri.TryCreate(item, UriKind.RelativeOrAbsolute, out uri)) 
    {  
     correctList.Add(item); 
    } 
} 

我想上面的代碼我希望它從列表中刪除asaswww.joker.testtest,但它沒有。

有人可以幫我解決這個問題。

更新: 剛剛試用Uri.IsWellFormedUriString這也沒有幫助。

更多更新

有效的URI的列表

無效的URI的列表

  • ASAS
  • 爲#@傷心
  • this.not.valid
  • www.asa.toptoptop
+0

http://joshua-smith.net/articles/view-article/3/Check-if-a-URL-is-valid-with-C –

+0

看看這個:http:// stackoverflow .com/questions/924679/c-sharp-how-can-i-check-if-a-url-exists-is-valid – Star

+0

什麼是您對有效URI的定義?你所有的例子都是有效的URI,儘管不是全部都是真實的_domains_。 – Oded

回答

2

你似乎對什麼URL(或URI,這裏的差別不重要)感到困惑。例如,http://stackoverflow.com是一個有效的絕對URL。另一方面,stackoverflow.com在技術上是一個有效的相對URL,但它會引用當前目錄中名爲stackoverflow.com的文件,而不是具有該名稱的網站。但是stackoverflow.com是一個註冊的域名

如果你想檢查一個域名是否有效,您需要定義你到底是「有效」的意思是:

  1. 它是一個有效的域名?檢查字符串是否由用點分隔的部分組成,每個部分可以包含字母,數字和連字符(-)。例如,asasthis.not.valid都是有效的域名。
  2. 它可能是一個互聯網域名嗎?互聯網上的域名(而不是內部網)是特定的,因爲它們始終有一個TLD(頂級域名)。所以,asas肯定不是互聯網域名,但this.not.valid可能是。
  3. 它是現有TLD下的域名嗎?你可以下載the list of all TLDs並檢查。例如,根據此規則this.not.valid將不被視爲有效,但thisisnotvalid.com會。
  4. 這是一個註冊的域名?
  5. 域名解析爲IP地址嗎?域名可以被註冊,但它的DNS記錄中可能沒有IP地址。
  6. 計算機的域名是否指向迴應請求?最有意義的請求是一個簡單的HTTP請求(例如試圖訪問http://domaininquestion/)或ping。
1

試試這個:

公共靜態布爾IsWellFormedUriString( 串uriString中, UriKind uriKind )

或者Alternativly你可以做到這一點使用正則表達式,如:

^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$ 

在這個list

+0

從http:// stackoverflow讀取後嘗試。 com/a/9356511/1182982,不工作或者 – Yasser

+0

他們很好形成,並且隨着OP添加到問題中,它不適合他的需求。 – Oded

+0

@Yasser然後你將不得不提出請求並測試它的成功或404錯誤 – V4Vendetta

0

採取alook你所有的例子都是有效的,
有些是絕對URL,有些是相對的,這就是爲什麼沒有被刪除。

否則對於每個Uri,您可以嘗試構建一個HttpWebRequest類 ,然後檢查正確的響應。

+0

'asas'和'www.joker.testtest'從列表中無效 – Yasser

+0

從技術上講,這是正確的。但是說'www.stackoverflow.com'是一個有效的相對URL不是正確的方式來看待它,因爲這將代表當前目錄中名爲'www.stackoverflow.com'的文件。 – svick

-1

你所有的URI都是格式良好的URI s所以TryCreateIsWellFormedUriString不適用於你的情況。

here,該方案試圖打開URI:

using(var client = new MyClient()) { 
    client.HeadOnly = true; 
    // fine, no content downloaded 
    string s1 = client.DownloadString("www.stackoverflow.com"); 
    // throws 404 
    string s2 = client.DownloadString("www.joker.testtest"); 
} 
+0

whats'MyClient' here? – Yasser

+0

檢查鏈接plz – MBZ

0

檢查其他的答案我知道你是不是在找域和ping的存在後回來,你需要根據測試它們的GRAMMER ...或者域名的語法正確嗎?

爲此,您只需要依賴正則表達式測試......並且制定適當的規則來平整域名,如果它們失敗,則將它們從列表中排除。

您可以adopt這些模式,並修改一個以適應您的需要,然後用列表中的每個元素進行測試。

1

問題是,您在此處添加的任何網址都不會歸爲絕對網址。爲此,你必須在URL的協議前加上它。

您可以測試並找出

www.stackoverflow.com - 相對URL
http://www.stackoverflow.com - 絕對URL
//www.stackoverflow.com - (這裏沒有驚喜Refer RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Section 4.2)絕對URL

問題是,您必須在前綴//前面顯示其絕對URL。

所以,簡而言之,因爲所有的URL都是相對URL,它會通過所有的測試。

+1

這個解釋s問題中的代碼有什麼問題,但它無法解決問題。 – svick