解析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&param2=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

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字符串以获取键值的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

C# - 解析网页的最佳方法?

解析字符串的有效方法

使用 C 解析 URL 的最佳方法?

如何解析 Postgresql JDBC url 以获取主机名、端口和 db_name

将自定义键值字符串解析为实际数组

从C#中的托管对象属性获取值的最佳方法