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
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);
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.
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¶m2=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¶m2=param2")!
print(url.queryParameters["param1"])
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