2009-12-04 148 views
2

我遇到了這段代碼,它應該確定動態(重寫)URL的層次結構中的父URL。其基本邏輯是這樣的:正則表達式實現

"/testing/parent/default.aspx" --> "/testing/default.aspx" 
"/testing/parent.aspx"   --> "/testing/default.aspx" 
"/testing/default.aspx"   --> "/default.aspx" 
"/default.aspx"     --> null 

...

private string GetParentUrl(string url) 
{ 
    string parentUrl = url; 

    if (parentUrl.EndsWith("Default.aspx", StringComparison.OrdinalIgnoreCase)) 
    { 
     parentUrl = parentUrl.Substring(0, parentUrl.Length - 12); 

     if (parentUrl.EndsWith("/")) 
      parentUrl = parentUrl.Substring(0, parentUrl.Length - 1); 
    } 

    int i = parentUrl.LastIndexOf("/"); 

    if (i < 2) return null; 

    parentUrl = parentUrl.Substring(0, i + 1); 

    return string.Format(CultureInfo.InvariantCulture, "{0}Default.aspx", parentUrl); 
} 

此代碼的工作,但它的氣味給我。它不適用於具有查詢字符串的網址。我怎樣才能改進它使用正則表達式?

+3

無論用regex重新實現你的代碼,你應該首先使用'System.Uri'解析URL來提取路徑字符串,然後處理它。不要嘗試解析整個URL,這很容易讓錯誤 - 重用現有的工作代碼! – 2009-12-04 18:03:23

回答

4

看一看答案SO question "Getting the parent name of a URI/URL from absolute name C#"

這將告訴你如何使用System.Uri訪問的URL的片段。 System.Uri也允許以你想要的方式操作URL(當然,不是自定義邏輯),而沒有創建無效URL的危險。沒有必要破解自己的功能來剖析網址。

+1

+1不推薦正則表達式!正則表達式不是這項工作的正確工具,標準庫是。 – Will 2009-12-04 18:14:38

+0

非常感謝。我沒有想到這一點。 – 2009-12-04 18:43:07

1

一個直接的方法將分裂URL「?」並連接查詢字符串的結尾......

1

我建議你不要在這種情況下使用正則表達式。解決這個任務的正則表達式將是「真正的代碼味道」。上面的代碼並不是很糟糕,請使用f3lix和Leon Shmulevich的建議使其更好。