2012-04-18 43 views
3

首先,這看起來應該是以前應該問過的,但是我找不到任何回答我的問題的東西。將網址轉換爲有效的href值

我的任務的基本概述是在基於用戶定義的Web地址的網頁上呈現錨鏈接。正如用戶定義的地址,這可能是任何格式,例如:

我需要什麼與此值做的是將其設置爲錨標記的href屬性。現在,問題在於(至少在Chrome中)只有前兩個示例會起作用,因爲它們被識別爲絕對URL路徑。最後兩個例子將重定向到相同的域(即作爲相對路徑)

所以最終的問題是:什麼是格式化這些值以確保一致的絕對路徑的最佳方式是什麼?我可以檢查http/https並添加它如果失蹤,但我希望有可能是一個開箱即用的.Net類,這將是更可靠。

此外,由於這是一個用戶定義的值,因此它可能是完整的垃圾,因此驗證URL的函數也是一個不錯的獎勵。

回答

1

幾個月前我們遇到了這個問題,需要一致的方法來確保URL是絕對的。我們還希望通過刪除http(s)://來顯示網頁上的網址。

我想出了這個功能:

public static string FormatUrl(string Url, bool IncludeHttp = null) 
{ 

    Url = Url.ToLower(); 

    switch (IncludeHttp) { 
     case true: 
      if (!(Url.StartsWith("http://") || Url.StartsWith("https://"))) 
       Url = "http://" + Url; 
      break; 
     case false: 
      if (Url.StartsWith("http://")) 
       Url = Url.Remove(0, "http://".Length); 
      if (Url.StartsWith("https://")) 
       Url = Url.Remove(0, "https://".Length); 
      break; 
    } 

    return Url; 

} 

我知道你的「開箱即用」庫後的時候,但是這可能有一定的幫助。

我認爲「開箱即用」解決方案的問題在於該功能不知道該URL是否應爲http://https://。有了我的功能,我已經假設它將成爲http://,但對於某些網址,您需要https://。如果微軟要在框架中構建這樣的東西,那麼從一開始就會出現問題。

+0

是否有理由在第一個「if」中使用按位OR而不是邏輯OR?看到[這個答案](http://stackoverflow.com/questions/7331686/why-and-not/7331721#7331721)的差異的解釋。 – 2012-04-18 10:16:05

+0

@DanielHilgarth我已經更新了答案。原來的腳本是用VB.NET編寫的,所以我已經把它發佈到了OP的c#中,但是錯過了。 – Curt 2012-04-18 10:17:28

+0

感謝您的建議,看起來我可能不得不選擇手動實現(至少現在),但'https'部分對我來說不是問題。對於那些類型的網站,我希望用戶明確包含https部分 – musefan 2012-04-18 10:30:01

0

您可以嘗試使用Uri類此重載:

Uri Constructor (String)

這個構造函數從URI字符串創建Uri實例。它解析URI,將其置於規範格式,並進行所需的轉義編碼。

此構造函數不確保Uri引用可訪問的資源。

此構造函數假定字符串參數引用絕對URI並等同於將UriKind設置爲Absolute調用Uri構造函數。如果傳遞給構造函數的字符串參數是相對URI,則此構造函數將引發UriFormatException。

這將嘗試從用戶輸入中構建一個規範的Uri。而且你有很多屬性可以檢查並提取你需要的URL部分。

+0

感謝您的建議,但嘗試後,它只適用於前兩個示例。最後兩個例子引發了一個例外。所以這不適合我的需求 – musefan 2012-04-18 10:28:09

+0

然後你應該嘗試兩種答案的組合。與另一個答案,你滿足了有http的必要條件。第二,你確認URL的其餘部分是否正確。你能檢查用戶輸入以強制包含http(s)嗎? – JotaBe 2012-04-18 10:36:19

+0

我可以強制輸入一個有效的網址,但是仍然要在使用之前進行檢查(只是爲了確保)。我現在會嘗試一個自定義函數,看看它是如何去的 – musefan 2012-04-18 10:41:19