iOS:将urlparsing为细分
采取NSURL对象的有效方法是什么?
foo://name/12345
并将其分解为一个string和一个无符号整数,其中stringval是“名称”和无符号整数是12345?
我假设该algorithm涉及将NSURL转换为NSString,然后使用NSScanner的一些组件完成剩下的部分?
NSURL有一个方法pathComponents
,它返回一个包含所有不同path组件的数组。 这应该可以帮助你获得整数部分。 要获得名称,我会使用NSURL的host
方法。 文档说,它应该工作,如果URL格式正确,不妨尝试一下。
总而言之,不需要转换成string,似乎有很多方法可以从NSURL对象本身计算出URL的组件。
我只能在这里添加一个例子, NSURL类是要去的。 这不是完整的,但会给你一个关于如何使用NSURL的提示:
NSString *url_ = @"foo://name.com:8080/12345;param?foo=1&baa=2#fragment"; NSURL *url = [NSURL URLWithString:url_]; NSLog(@"scheme: %@", [url scheme]); NSLog(@"host: %@", [url host]); NSLog(@"port: %@", [url port]); NSLog(@"path: %@", [url path]); NSLog(@"path components: %@", [url pathComponents]); NSLog(@"parameterString: %@", [url parameterString]); NSLog(@"query: %@", [url query]); NSLog(@"fragment: %@", [url fragment]);
输出:
scheme: foo host: name.com port: 8080 path: /12345 path components: ( "/", 12345 ) parameterString: param query: foo=1&baa=2 fragment: fragment
这个问题NSURL的参数String混淆了';' 关于url, “&”也很有趣。
其实有一个更好的方法来parsingNSURL。 使用NSURLComponents。 这是一个简单的例子:
迅速:
extension URL { var params: [String: String]? { if let urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: true) { if let queryItems = urlComponents.queryItems { var params = [String: String]() queryItems.forEach{ params[$0.name] = $0.value } return params } } return nil } }
Objective-C的:
NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; NSArray *queryItems = [components queryItems]; NSMutableDictionary *dict = [NSMutableDictionary new]; for (NSURLQueryItem *item in queryItems) { [dict setObject:[item value] forKey:[item name]]; }
感谢尼克指点我正确的方向。
我想比较文件的URL,但是有额外的斜线问题使得isEqualString无用。 你可以用我的例子来比较两个url,首先解构它们,然后比较两个url。
- (BOOL) isURLMatch:(NSString*) url1 url2:(NSString*) url2 { NSURL *u1 = [NSURL URLWithString:url1]; NSURL *u2 = [NSURL URLWithString:url2]; if (![[u1 scheme] isEqualToString:[u2 scheme]]) return NO; if (![[u1 host] isEqualToString:[u2 host]]) return NO; if (![[url1 pathComponents] isEqualToArray:[url2 pathComponents]]) return NO; //check some properties if not nil as isEqualSting fails when comparing them if ([u1 port] && [u2 port]) { if (![[u1 port] isEqualToNumber:[u2 port]]) return NO; } if ([u1 query] && [u2 query]) { if (![[u1 query] isEqualToString:[u2 query]]) return NO; } return YES; }