我有一个Url
,我想获得路径部分,但没有尾随文件名。如果Url
为http://my.com/dir1/dir2/file.ext
,那么我想获得/dir1/dir2
。
我尝试过各种分裂(let parts = url.path().split("/");
等)并收集和加入,代码很糟糕,看起来效率低下。
答案 0 :(得分:6)
使用包时,了解包装箱所关注的域名很有用。解决绝对URL的相对路径是一种非常常见的情况。对于url crate,这是通过join
完成的:
extern crate url;
use url::Url;
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());
}
您还可以使用path_segments_mut
:
extern crate url;
use url::Url;
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());
}
答案 1 :(得分:4)
您可以使用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"));
}
这不像调用一个方法那么容易,但这至少是有效的。
如果您想更改当前网址,可以使用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");
}