Best way to parse URL string to get values for keys?

前端 未结 16 1032
广开言路
广开言路 2020-11-29 18:36

I need to parse a URL string like this one:

&ad_eurl=http://www.youtube.com/video/4bL4FI1Gz6s&hl=it_IT&iv_logging_level=3&ad_flags=0&ends         


        
相关标签:
16条回答
  • 2020-11-29 19:16

    Since iOS 8 you can directly use properties name and value on NSURLQueryItem.

    Example, how to parse URL and get specific values for a key in parsed pairs.

    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);
    
    0 讨论(0)
  • 2020-11-29 19:17

    To get query parameters as a dict:

    extension URL {
        var parameters: [String: String] {
            var parameters = [String: String]()
            if let urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: false),
                let queryItems = urlComponents.queryItems {
                for queryItem in queryItems where queryItem.value != nil {
                    parameters[queryItem.name] = queryItem.value
                }
            }
            return parameters
        }
    }
    

    or return Optional if this more convenient in your case.

    0 讨论(0)
  • 2020-11-29 19:18

    I also answered this at https://stackoverflow.com/a/26406478/215748.

    You can use queryItems in URLComponents.

    When you get this property’s value, the NSURLComponents class parses the query string and returns an array of NSURLQueryItem objects, each of which represents a single key-value pair, in the order in which they appear in the original query string.

    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)
    

    Alternatively, you can add an extension on URL to make things easier.

    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
        }
    }
    

    You can then access the parameter by its name.

    let url = URL(string: "http://example.com?param1=value1&param2=param2")!
    print(url.queryParameters["param1"])
    
    0 讨论(0)
  • 2020-11-29 19:21

    A Swift 2 approach:

    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
      }
    
    }
    

    Download Gist

    0 讨论(0)
提交回复
热议问题