代码之家  ›  专栏  ›  技术社区  ›  rodskagg

在swift中删除URL中的所有路径组件

  •  0
  • rodskagg  · 技术社区  · 6 年前

    我有一个包含许多路径组件的URL。是否有一种优雅的方法来删除所有路径组件?基本上,我只想保留这个方案和URL的主机。以及端口(如果可用)。

    当然,我可以使用现有URL中的相关属性创建新的URL对象:

    let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"
    

    或者循环路径组件,删除最后一个组件,直到没有保留。

    但这两个解决方案看起来都不那么优雅,所以我正在寻找一个更好、更安全、更高效的解决方案。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Sulthan    6 年前

    我看到的唯一可能就是 URLComponents 手动移除部分组件:

    let url = URL(string: "http://www.google.com/and/my/path")!
    print(url)
    
    var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
    components.path = ""
    print(components.url!) // http://www.google.com
    

    如果您决定手动构建URL,那么最好还是使用 URL组件 为此:

    let url = URL(string: "http://www.google.com/and/my/path")!
    var components = URLComponents()
    components.scheme = url.scheme
    components.host = url.host
    print(components.url!)
    
        2
  •  0
  •   Amrit Trivedi    6 年前

    您可以尝试regex方法。它将比其他方式更优雅。我只是快速编码。regex可能不起作用,但对于您的查询类型,您将获得更多的regex示例。

        let urlRegEx = "((http(s)?:\\(/)\\/)|(\\/.*){1}"
        let string = "https://pixabay.com/en/art-beauty-fairytales-fantasy-2436545/"
        let matched = matches(for: urlRegEx, in: string)
        print(matched)
    
       func matches(for regex: String, in text: String) -> [String] {
    
        do {
            let regex = try NSRegularExpression(pattern: regex)
            let nsString = text as NSString
            let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
            return results.map { nsString.substring(with: $0.range)}
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
       }
    
        3
  •  0
  •   Abdelahad Darwish    6 年前

    您可以使用Reg-Ex

      let url = "http://www.somedomain.com/?f"
                    let pattern = "^(http://|https://)[A-Za-z0-9.-]+(?!.*\\|\\w*$)"
                     let regex = try! NSRegularExpression.init(pattern: pattern, options: .caseInsensitive)
                    let matches = regex.matches(in: url, options: [], range: NSMakeRange(0, url.count))
    
                    matches.enumerated().forEach({ (_, match) in
                        print((url as NSString).substring(with: match.range))
                    })