从 URL in Swift 中删除所有路径组件
Remove all pathcomponents from a URL in Swift
我有一个包含许多路径组件的 URL。有没有一种优雅的方法来删除所有路径组件?基本上,我只想保留 URL 的方案和主机。以及端口(如果可用)。
我当然可以创建一个新的 URL 对象,使用现有 URL:
中的相关属性
let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"
或者遍历路径组件,删除最后一个组件,直到 none 剩余。
但是这两种解决方案看起来都不是那么优雅,所以我正在寻找更好、更安全、更高效的解决方案。
我看到的唯一可能是使用 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,使用 URLComponents
可能更好:
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!) // http://www.google.com
你可以试试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: [=10=].range)}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
您可以使用 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))
})
我有一个包含许多路径组件的 URL。有没有一种优雅的方法来删除所有路径组件?基本上,我只想保留 URL 的方案和主机。以及端口(如果可用)。
我当然可以创建一个新的 URL 对象,使用现有 URL:
中的相关属性let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"
或者遍历路径组件,删除最后一个组件,直到 none 剩余。
但是这两种解决方案看起来都不是那么优雅,所以我正在寻找更好、更安全、更高效的解决方案。
我看到的唯一可能是使用 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,使用 URLComponents
可能更好:
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!) // http://www.google.com
你可以试试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: [=10=].range)}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
您可以使用 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))
})