我有一个Url,我想获得路径部分,但没有尾随文件名.如果那Url是http://my.com/dir1/dir2/file.ext我想得到的/dir1/dir2.
我已经尝试了各种分裂(let parts = url.path().split("/");等等)和收集和加入,代码很糟糕,看起来效率低下.
使用包时,了解包装箱所关注的域很有用.解决绝对URL的相对路径是一种非常常见的情况.对于url crate,这是通过以下方式完成的join:
use url::Url; // 2.1.0
fn main() {
let u = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
let u2 = u.join("./").unwrap();
assert_eq!("/dir1/dir2/", u2.path());
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用path_segments_mut:
use url::Url; // 2.1.0
fn main() {
let mut u = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
u.path_segments_mut().unwrap().pop();
assert_eq!("/dir1/dir2", u.path());
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 rsplitn
extern crate url;
use url::Url;
fn shorten(url: &Url) -> Option<&str> {
url.path().rsplitn(2, '/').skip(1).next()
}
fn main() {
let url = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
assert_eq!(shorten(&url), Some("/dir1/dir2"));
}
Run Code Online (Sandbox Code Playgroud)
这不像调用一个方法那样容易,但是至少有效。
如果要更改当前网址,可以使用Url::path_segments_mut:
extern crate url;
use url::Url;
fn shorten(mut url: Url) -> Result<Url, ()> {
url.path_segments_mut()?.pop();
Ok(url)
}
fn main() {
let url = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
assert_eq!(shorten(url).unwrap().path(), "/dir1/dir2");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |