解析URL字符串以获取键值的最佳方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析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月):this answer is better。 Apple在ios 7中添加了NSURLComponents
。
我会创建一个字典,获取一个键/值对的数组
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"];
这是未经测试的,你应该做更多的错误测试。
全功能:
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:@"someURL" resolvingAgainstBaseURL:false];
NSArray *queryItems = urlComponents.queryItems;
NSMutableArray *someIDs = [NSMutableArray new];
for (NSURLQueryItem *item in queryItems)
if ([item.name isEqualToString:@"someKey"])
[someIDs addObject:item.value];
NSLog(@"%@", someIDs);
对URL的Swift 3扩展形式的最新解决方案
+ (NSString *)getQueryComponentWithName:(NSString *)name fromURL:(NSURL *)url
NSString *component = nil;
if (url)
NSString *query = url.query;
NSMutableDictionary *queryStringDictionary = [NSMutableDictionary dictionary];
NSArray *urlComponents = [query 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];
component = [queryStringDictionary objectForKey:name];
return component;
[self getQueryComponentWithName:@"example" fromURL:[NSURL URLWithString:@"https://google.es/?example=test"]];
extension URL
func value(for paramater: String) -> String?
let queryItems = URLComponents(string: self.absoluteString)?.queryItems
let queryItem = queryItems?.filter($0.name == paramater).first
let value = queryItem?.value
return value
NSURL中的Query属性将给出查询字符串。然后,您可以使用componentsSeparatedByString解析查询字符串
gist
NSArray *parameters = [[url query] componentsSeparatedByString:@"&"];
NSMutableDictionary *keyValuePairs = [NSMutableDictionary dictionary];
for (NSString *eachParam in parameters)
NSArray *QryParts = [eachParam componentsSeparatedByString:@"="];
if ( [QryParts count] == 2 )
keyValuePairs[QryParts[0]] = QryParts[1];
else
keyValuePairs[QryParts[0]] = QryParts[0];
NSString * name = [keyValuePairs valueForKey:@"name"];
NSString * username = [keyValuePairs valueForKey:@"username"];
Swift 2方法:
- (NSString *)getLoginTokenFromUrl:(NSString *)urlString
NSURL *url = [NSURL URLWithString:urlString];
NSArray *queryStrings = [url.query componentsSeparatedByString:@"&"];
NSMutableDictionary *queryParams = [[NSMutableDictionary alloc] init];
for (NSString *qs in queryStrings)
// Get the parameter name
NSArray *components = [qs componentsSeparatedByString:@"="];
NSString *key = [components objectAtIndex:0];
// Get the parameter value
NSString *value;
if (components.count > 1)
value = [components objectAtIndex:1];
else
value = @"";
value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
queryParams[key] = value;
return [queryParams objectForKey:@"login_token"];
extension NSURL
var queryDictionary: [String: String]
var queryDictionary = [String: String]()
guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false), queryItems = components.queryItems else return queryDictionary
queryItems.forEach queryDictionary[$0.name] = $0.value
return queryDictionary
要将查询参数作为dict获取:
Download Gist
或返回如果在您的情况下更方便,则返回可选。
我也在https://stackoverflow.com/a/26406478/215748回答了这个问题。
你可以在queryItems
中使用URLComponents
。
当您获得此属性的值时,NSURLComponents类将解析查询字符串并返回NSURLQueryItem对象的数组,每个对象表示一个键值对,它们在原始查询字符串中出现的顺序。
Swift 3
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)
Swift 2.3
使用NSURLComponents
而不是URLComponents
。
Objective C
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:NO];
NSArray *queryItems = urlComponents.queryItems;
NSString *param1 = [self valueForKey:@"param1"
fromQueryItems:queryItems];
NSLog(@"%@", param1);
…
- (NSString *)valueForKey:(NSString *)key
fromQueryItems:(NSArray *)queryItems
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", key];
NSURLQueryItem *queryItem = [[queryItems
filteredArrayUsingPredicate:predicate]
firstObject];
return queryItem.value;
我有点晚了,但到目前为止提供的答案并没有按照我的需要运作。您可以使用此代码段:
NSMutableDictionary *queryStrings = [[NSMutableDictionary alloc] init];
for (NSString *qs in [url.query componentsSeparatedByString:@"&"])
// Get the parameter name
NSString *key = [[qs componentsSeparatedByString:@"="] objectAtIndex:0];
// Get the parameter value
NSString *value = [[qs componentsSeparatedByString:@"="] objectAtIndex:1];
value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
queryStrings[key] = value;
其中以上是关于解析URL字符串以获取键值的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章