我正在尝试获取 WKWebView 的当前 URL,从中搜索/复制一个值,然后创建一个新 URL。
我使用 Swift 并拥有这样的 URL
https://example.org/bundle-572974a2.html
并尝试获取以下值 572974a2
。
我的目的是创建一个具有该值的新 URL。这些数字可能会不时发生变化。
我使用此代码来获取当前的 WKWebView URL。我想我必须先将其转换为字符串。
let oldURL = webView.url
我使用此代码来创建我的新 URL。
var components = URLComponents()
components.scheme = "https"
components.host = "new-example.org"
components.path = "/g"
components.queryItems = [
URLQueryItem(name: "newbundle", value: "XXXXXXXX")
]
let newURL = components.url
如何使用旧 URL 的值
value: "XXXXXXXX"
更改/粘贴 572974a2
?
一些简单的 URL 操作和字符串处理将为您提供旧 URL 中的号码:
let oldURL = URL(string: "https://example.org/bundle-572974a2.html")! // An example
let name = oldURL.deletingPathExtension().lastPathComponent // bundle-572974a2
let number = name.dropFirst(7) // remove "bundle-"
这假设数字前面总是带有“bundle-”(或者任何七个字母的序列)。如果情况可能有所不同,那么
dropFirst(7)
的使用将需要替换为可以处理“bundle-572974a2”等字符串的代码”并删除你不想要的部分。
然后构建新的 URL 变为:
var components = URLComponents()
components.scheme = "https"
components.host = "new-example.org"
components.path = "/g"
components.queryItems = [
URLQueryItem(name: "newbundle", value: String(number))
]
let newURL = components.url
如果您可能同时需要删除前缀和后缀,以下是删除它们的一种方法。此代码假设如果有要删除的后缀,则将有一个要删除的前缀。如果有后缀且没有要删除的前缀,则此代码会给出错误的结果。
var number = url.deletingPathExtension().lastPathComponent
if let hyphen = number.firstIndex(of: "-") {
number = String(number[number.index(after: hyphen)...])
}
if let hyphen = number.lastIndex(of: "-") {
number = String(number[..<hyphen])
}
附注Swift 中的字符串操作很痛苦。
使用以下函数获取 url 中的任意或所有参数:
let params = getQueryItems(urlStr)
if let userId = params["user_id"] {
//do something with user id
}
func getQueryItems(_ urlString: String) -> [String : String] {
var queryItems: [String : String] = [:]
let components: NSURLComponents? = getURLComonents(urlString)
for item in components?.queryItems ?? [] {
queryItems[item.name] = item.value?.removingPercentEncoding
}
return queryItems
}
func getURLComonents(_ urlString: String?) -> NSURLComponents? {
var components: NSURLComponents? = nil
let linkUrl = URL(string: urlString?.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? "")
if let linkUrl = linkUrl {
components = NSURLComponents(url: linkUrl, resolvingAgainstBaseURL: true)
}
return components
}