代码之家  ›  专栏  ›  技术社区  ›  Luke Vo

如何将UriBuilder用于相对Uri,以便输出与输入完全相同,但路径已更改?

  •  0
  • Luke Vo  · 技术社区  · 3 年前

    我需要一个对URL进行重定向的方法。输入可以是绝对URL或相对URL,如下所示:

    Inp: test/something.js?v=1#a
    Out: testcontent/something.js?v=1#a
    
    Inp: /test/something.js?v=1#a
    Out: /testcontent/something.js?v=1#a
    
    Inp: ://example.com/test/something.js?v=1#a
    Out: ://example.com/testcontent/something.js?v=1#a
    
    Inp: https://example.com/test/something.js?v=1#a
    Out: https://example.com/testcontent/something.js?v=1#a
    

    我知道我可以“假装”一个绝对 Uri 通过分配主机以便我可以访问 Segments 财产和用途 UriBuilder 。问题是我找不到一个好的方法来使输出与输入中可用的任何部分具有相同的格式。下面两种方法是我的尝试:我可以获取分段,修改它们并将它们连接回来,然后构建一个绝对 乌里 问题是, MakeRelativeUri 更改输出的形式。

    static readonly Uri BaseUri = new("https://0.0.0.0/index.html/");
    static string[] GetUriSegments(Uri uri)
    {
        return uri.IsAbsoluteUri ?
            uri.Segments :
            new Uri(BaseUri, uri.OriginalString).Segments;
    }
    
    static Uri CreateUri(Uri uri, string[] segments)
    {
        var isAbs = uri.IsAbsoluteUri;
        var absUri = isAbs ? uri : new Uri(BaseUri, uri.OriginalString);
    
        var builder = new UriBuilder(absUri)
        {
            Path = string.Join("", segments)
        };
    
        var result = builder.Uri;
        if (!isAbs)
        {
            result = BaseUri.MakeRelativeUri(result);
        }
    
        return result;
    }
    

    我应该如何解决这个问题?

    0 回复  |  直到 3 年前
        1
  •  1
  •   tmaj    3 年前

    这涵盖了提供的所有示例:

    Regex rg = new Regex(@"(^|/|//[^/]*/)test/");
    var u2 = rg.Replace(u, "$1testcontent/");
    

    不清楚你是否只想改变第一个 test/ 或全部,但使用此代码

    https://example.com/test/test/something.js?v=1#a
    

    变成

    https://example.com/testcontent/test/something.js?v=1#a
    
    推荐文章