2009-12-04 79 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的建议使其更好。