【问题标题】:What's the quickest, cleanest way to remove parent pathing from a URL string?从 URL 字符串中删除父填充的最快、最干净的方法是什么?
【发布时间】:2011-03-12 15:59:52
【问题描述】:

在 C# 中,是否有任何内置方法可以“更正”包含父路径的 URL?所以,我想拿这个:

/foo/bar/../baz.html

然后把它变成……

/foo/baz.html

(“bar”目录被路径中的“..”否定。)

我试过手动滚动这个,但逻辑变得非常丑陋,很快。考虑类似的事情:

/foo1/foo2/../foo3/foo4/foo5/../../bar.html

我的路径是逐段遍历 URL,然后开始编写新的 URL。如果段 2 不是“..”,我只会在新 URL 中包含段 1。但是,在上述情况下,我需要“向前看”并弄清楚我要来多少父路径。

我尝试使用 Path.GetFullPath,从技术上讲,它可以正常工作,但是,伙计,它很难看。 公平警告:您可能不想看这个:

Path.GetFullPath(myUrl).Replace(Path.GetFullPath(@"\"), "").Replace(@"\", "/") + "/";

GetFullPath 从 "C:\" 根目录返回一个文件系统路径,因此您基本上也必须替换它,而不是转换斜杠等。

我最终可能会解决这个问题(并且我上面的丑陋代码在技术上是有效的),但让我震惊的是我不能成为第一个尝试这个的人。谷歌没有帮助。

(另一种语言的答案也会有帮助——至少它会显示逻辑。)

【问题讨论】:

    标签: c# string url


    【解决方案1】:

    如果您真的想推出自己的版本,请尝试使用堆栈:

    1. 通过路径分隔符'/'分割路径
    2. 遍历段
      1. 将任何不是'..' 的段推入堆栈
      2. 如果段为'..',则出栈
    3. 使用路径分隔符'/' 连接段

    但正如其他人所指出的那样:让你的图书馆为你做这件事可能会更好。

    【讨论】:

    • OP 实际上要求一个框架方法。由于他找不到一个,他自己推出了一个,但更喜欢内置方法..
    • 当然。事实上,这正是我支持你的原因。但OP也提到他想学习逻辑。从他的帖子中,我感觉到他还没有使用堆栈来解决这类问题 - 认为他可能会在我们处理这些问题时学到一些东西......
    • 达人:我确实想要并欣赏框架解决方案,但你的算法真的很好。我希望我能在今天凌晨 1 点想到这一点。我不会投票,因为框架方法“更正确”,但做得很好。
    • 我的评论更像是对您帖子中第一句话的评论。您的解决方案很好(+1),但从我收集到的第一句话中,您认为 OP 真的想推出他自己的版本。唉,我错了。 :)
    【解决方案2】:

    这应该适用于所有 URL(包括带有 QueryString 的 URL):

    var url = "/foo/bar/../bar.html";
    var ubuilder = new UriBuilder();
    ubuilder.Path = url;
    var newURL = ubuilder.Uri.LocalPath;
    

    【讨论】:

    • +1 它使用 System.Uri 类来解析路径,因此对于 web url 应该是非常安全的。你甚至可以用一条丑陋的线路做到这一点:string normalized = new UriBuilder() { Path = path }.Uri.LocalPath
    • @Jaroslav Jandek:是的,你确实可以作为一个单行者来做。但正如你所说,它有点难看。 ;)
    【解决方案3】:

    试试VirtualPathUtility 类。它有一些在这里应该能够提供帮助的方法,特别是 ToAbsolute() 方法,如果我没有记错的话,它应该能够采用应用程序相对路径并将其转换为应用程序绝对路径。

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2011-06-28
      • 2020-11-02
      • 2017-05-19
      • 2013-03-23
      • 2010-09-06
      • 2016-08-11
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多