解析URL字符串以获取键值的最佳方法?
我需要解析这样的URL字符串:
&ad_eurl=http://www.youtube.com/video/4bL4FI1Gz6s&hl=it_IT&iv_logging_level=3&ad_flags=0&endscreen_module=http://s.ytimg.com/yt/swfbin/endscreen-vfl6o3XZn.swf&cid=241&cust_gender=1&avg_rating=4.82280613104
我需要将NSString拆分为类似cid=241
和的标志部分&avg_rating=4.82280613104
。我一直在用,substringWithRange:
但是值以随机顺序返回,所以搞砸了。是否有任何类可以轻松解析,因此您基本上可以将其转换为NSDictionary以便能够读取键的值(例如ValueForKey:cid
应该返回241
)。还是有比使用NSMakeRange
子字符串更简单的解析方法?
回答:
**编辑(2018年6月):[
这个答案更好
您可以queryItems在中使用URLComponents。
当获得该属性的值时,NSURLComponents类将解析查询字符串并返回一个NSURLQueryItem对象数组,每个对象代表一个键-值对,并按照它们在原始查询字符串中出现的顺序排列。
let url = "http://example.com?param1=value1¶m2=param2"let queryItems = URLComponents(string: url)?.queryItems
let param1 = queryItems?.filter({$0.name == "param1"}).first
print(param1?.value)
另外,您可以在URL上添加扩展名,以简化操作。
extension URL { var queryParameters: QueryParameters { return QueryParameters(url: self) }
}
class QueryParameters {
let queryItems: [URLQueryItem]
init(url: URL?) {
queryItems = URLComponents(string: url?.absoluteString ?? "")?.queryItems ?? []
print(queryItems)
}
subscript(name: String) -> String? {
return queryItems.first(where: { $0.name == name })?.value
}
}
然后,您可以按名称访问参数。
let url = URL(string: "http://example.com?param1=value1¶m2=param2")!print(url.queryParameters["param1"])
我将创建一个字典,获得键/值对的数组
NSMutableDictionary *queryStringDictionary = [[NSMutableDictionary alloc] init];NSArray *urlComponents = [urlString componentsSeparatedByString:@"&"];
然后填充字典:
for (NSString *keyValuePair in urlComponents){
NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];
NSString *key = [[pairComponents firstObject] stringByRemovingPercentEncoding];
NSString *value = [[pairComponents lastObject] stringByRemovingPercentEncoding];
[queryStringDictionary setObject:value forKey:key];
}
然后,您可以查询
[queryStringDictionary objectForKey:@"ad_eurl"];
这未经测试,您可能应该再进行一些错误测试。
以上是 解析URL字符串以获取键值的最佳方法? 的全部内容, 来源链接: utcz.com/qa/397712.html