以简书的这个url为例:
http://www.jianshu.com/search?q=ios%E7%BD%91%E7%BB%9C%E8%AF%AD%E9%9F%B3%E6%92%AD%E6%94%BE&page=1&type=notes
“?”后面的是参数,多个参数使用“&”连接。每一组参数有一个key和一个value,用“=”相连。比如:
q=ios%E7%BD%91%E7%BB%9C%E8%AF%AD%E9%9F%B3%E6%92%AD%E6%94%BE
page=1
type=notes
思路:根据url的命名规则,通过“?”“&”“=”识别出参数,通过字符串截取方法,快速的把url中的parameters截取下来。
主要方法(函数)1:NSRange range = [Astring rangeOfString:Bstring];
NSRange 由 location 和 length 组成.
使用这个方法可以找出?在url中位置:range.location,range.length = 1;
主要方法(函数)2:NSString*parametersString = [url substringFromIndex:range.location+1];
用这个方法,截取出所有参数:q=ios%E7%BD%91%E7%BB%9C%E8%AF%AD%E9%9F%B3%E6%92%AD%E6%94%BE&page=1&type=notes。
主要方法(函数)3:[parametersString containsString:@"&"]
通过判断参数中是否包含“&”符号,来识别url中是一个参数还是两个以上参数。返回值是BOOL。
主要方法4:[parametersString componentsSeparatedByString:@"&"],返回值是一个数组。
通过“&”符号把每一个参数分开,存入数组中。
[parametersString componentsSeparatedByString:@"="];
通过“=”符号把每一个参数中的key和value分开,存入数组中。
主要方法6:NSString*key = [pairComponents.firstObject stringByRemovingPercentEncoding];
NSString*value = [pairComponents.lastObjectstringByRemovingPercentEncoding]
将参数中的key和value转化为字符串。
主要方法就这些。加一些循环和判断。就可以写出来。我的做法是,写一个NSString的分类。在分类中实现此方法。以后直接调用就可以。
以下就是完整代码:
-(NSMutableDictionary*)getURLParameters {
NSRange range = [self rangeOfString:@"?"];
if(range.location==NSNotFound) {
return nil;
}
NSMutableDictionary *params = [NSMutableDictionary dictionary];
NSString *parametersString = [self substringFromIndex:range.location+1];
if([parametersString containsString:@"&"]) {
NSArray *urlComponents = [parametersString componentsSeparatedByString:@"&"];
for(NSString *keyValuePair in urlComponents) {
//生成key/value
NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];
NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];
NSString*value = [pairComponents.lastObject stringByRemovingPercentEncoding];
//key不能为nil
if(key==nil|| value ==nil) {
continue;
}
id existValue = [params valueForKey:key];
if(existValue !=nil) {
//已存在的值,生成数组。
if([existValue isKindOfClass:[NSArray class]]) {
//已存在的值生成数组
NSMutableArray*items = [NSMutableArray arrayWithArray:existValue];
[items addObject:value];
[params setValue:items forKey:key];
}else{
//非数组
[params setValue:@[existValue,value]forKey:key];
}
}else{
//设置值
[params setValue:value forKey:key];
}
}
}else{
//单个参数生成key/value
NSArray *pairComponents = [parametersString componentsSeparatedByString:@"="];
if(pairComponents.count==1) {
return nil;
}
//分隔值
NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];
NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding];
//key不能为nil
if(key ==nil|| value ==nil) {
return nil;
}
//设置值
[params setValue:value forKey:key];
}
return params;
}
代码中一些KVC的方法和数组中添加对象,addObject,isKindOfClass的方法就不一一解释了。
截取的方法有很多,这里只提供一个参考。欢迎大家集思广益,共同进步。
如发现问题,请在评论区指出。