一尘不染

解析URL字符串以获取键值的最佳方法?

swift

我需要解析这样的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子字符串更简单的解析方法?


阅读 334

收藏
2020-07-07

共1个答案

一尘不染

**编辑(2018年6月):[
这个答案更好

您可以queryItems在中使用URLComponents。

当获得该属性的值时,NSURLComponents类将解析查询字符串并返回一个NSURLQueryItem对象数组,每个对象代表一个键-值对,并按照它们在原始查询字符串中出现的顺序排列。

let url = "http://example.com?param1=value1&param2=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&param2=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"];

这未经测试,您可能应该再进行一些错误测试。

2020-07-07