2009-05-29 26 views

回答

44

可以使用Uri.TryCreate驗證一個網址:

public bool IsValidUri(string uri) 
{ 
    Uri validatedUri; 
    return Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out validatedUri); 
} 

的言論表明,TryCreate只是移動異常處理向下一個級別。但是,我查看了源代碼,發現情況並非如此。 TryCreate裏面沒有try/catch,它使用了一個不應該拋出的自定義解析器。

0
static bool IsValidUri(string urlString) { 
    try { 
     new Uri(urlString); 
     return true; 
    } catch { 
     return false; 
    } 
} 
+0

查看關於divo的回答表現的評論 – 2009-05-29 20:26:13

0

比使用try/catch功能更快的方法(可能)是使用正則表達式。如果您不得不驗證數千次的網址,那麼多次捕捉異常的速度會很慢。

Here's a link to sample Regex - 使用Google查找更多。

+0

不知何故,我懷疑這一點。正則表達式,即使編譯也不是特別快。即使你能寫出一份準確的文章。 – Kris 2009-05-29 20:07:56

+0

這會更快,但很難得到正確的。 – 2009-05-29 20:11:30

+1

克里斯 - 也許你不明白多麼昂貴的拋出異常可以 - 如果在一個大循環中完成,它們非常慢。 – RichardOD 2009-05-29 20:13:33

30

現在提供的答案不檢查一個計劃,允許各種不需要的輸入,這可能會讓你容易受到JavaScript注入(請參閱TheCloudle的評論ssSky)。

URI只是一個對象的唯一標識。 「C:\ Test」是一個有效的URI。

在項目中,我用下面的代碼:

/// <summary> 
/// Validate a URL. 
/// </summary> 
/// <param name="url"></param> 
/// <returns></returns> 
private bool ValidUrl(string url) 
{ 
    Uri validatedUri; 

    if (Uri.TryCreate(url, UriKind.Absolute, out validatedUri)) //.NET URI validation. 
    { 
     //If true: validatedUri contains a valid Uri. Check for the scheme in addition. 
     return (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps); 
    } 
    return false; 
} 

定義哪些方案,你會允許並相應地修改代碼。