删除Url路径的尾随文件名

时间:2018-02-13 12:51:48

标签: rust

我有一个Url,我想获得路径部分,但没有尾随文件名。如果Urlhttp://my.com/dir1/dir2/file.ext,那么我想获得/dir1/dir2

我尝试过各种分裂(let parts = url.path().split("/");等)并收集和加入,代码很糟糕,看起来效率低下。

2 个答案:

答案 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");
}