iOS 从青铜到王者iOSiOS 开发

iOS开发:URL中的参数截取方法

2016-08-31  本文已影响3566人  lesmiserables0

以简书的这个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的方法就不一一解释了。

截取的方法有很多,这里只提供一个参考。欢迎大家集思广益,共同进步。

如发现问题,请在评论区指出。

上一篇 下一篇

猜你喜欢

热点阅读