我想知道是否其他人可以根据System.Uri标准.NET框架中可用的方法或其他方法,提出一种简化相对URL的更好方法。我的尝试有效,但是非常可怕:
public static String SimplifyUrl(String url)
{
var baseDummyUri = new Uri("http://example.com", UriKind.Absolute);
var dummyUri = new Uri(baseDummyUri , String.Join("/",
Enumerable.Range(0, url.Split(new[] { ".." }, StringSplitOptions.None).Length)
.Select(i => "x")));
var absoluteResultUri = new Uri(dummyUri, url);
var resultUri = dummyUri.MakeRelativeUri(absoluteResultUri);
return resultUri.ToString();
}
Run Code Online (Sandbox Code Playgroud)
例如,这给出了:
./foo -> foo
foo/./bar -> foo/bar
foo/../bar -> bar
Run Code Online (Sandbox Code Playgroud)
使它如此尴尬的问题是,Uri它本身似乎并没有简化相对的URL,而且MakeRelativeUri仅适用于绝对URL。因此,为了诱使Uri类执行我想要的操作,我构造了具有适当数量的嵌套的基本URL。
我也可以使用System.IO.Path,但是随后我必须搜索并替换反斜杠来斜杠...
必须有更好的方法,对吗?
Pio*_*app 10
您可以使用单线来做到这一点:
new Uri(new Uri("http://example.com/"), url).AbsolutePath.TrimStart('/');
Run Code Online (Sandbox Code Playgroud)
以下测试显示了结果:
[Theory]
[InlineData("./foo", "foo")]
[InlineData("/foo", "foo")]
[InlineData("foo", "foo")]
[InlineData("foo/./bar", "foo/bar")]
[InlineData("/foo/./bar", "foo/bar")]
[InlineData("/foo/../bar", "bar")]
[InlineData("foo/../bar", "bar")]
public void Test(string url, string expected)
{
var result = new Uri(new Uri("http://example.com/"), url).AbsolutePath.TrimStart('/');
Assert.Equal(expected, result);
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您想/一开始就离开,只需删除TrimStart('/')
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |