什麼是採取NSURL對象的有效方式,如下列:的iOS:解析URL成段
foo://name/12345
,並把它分解成一個字符串和一個無符號整數,字符串val爲「名'和無符號整數是12345?
我假設該算法涉及將NSURL轉換爲NSString,然後使用NSScanner的某些組件完成其餘部分?
什麼是採取NSURL對象的有效方式,如下列:的iOS:解析URL成段
foo://name/12345
,並把它分解成一個字符串和一個無符號整數,字符串val爲「名'和無符號整數是12345?
我假設該算法涉及將NSURL轉換爲NSString,然後使用NSScanner的某些組件完成其餘部分?
NSURL有一個方法pathComponents
,它返回一個包含所有不同路徑組件的數組。這應該可以幫助你獲得整數部分。要獲得名稱,我會使用NSURL的host
方法。該文檔說,它應該工作,如果URL格式正確,不妨嘗試一下。
總而言之,不需要轉換成字符串,似乎有很多方法可以從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's parameterString confusion with use of ';' vs '&'也很有趣關於網址。
感謝尼克指出我在正確的方向。
我想比較文件的URL,但有額外的斜線問題,使isEqualString無用。你可以用我的例子來比較兩個網址,首先解構它們,然後比較兩個網址。
- (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;
}
實際上有一個更好的方法來解析NSURL。使用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]];
}
謝謝,這對我工作:-) – 2017-05-03 10:52:22
感謝寫這一切了 – Sneakyness 2013-01-25 23:16:14
根據我的經驗,使用'pathComponents'是有風險。事實上,如果你的路徑組件包含一個'/',EVEN ENCODED,pathComponents將會對它進行解碼並將其視爲分隔符。我寧願自己解析路徑組件。 – 2015-01-23 10:06:34
似乎除了[url parameterString] ...之外,任何想法爲什麼這可能是「(null)」,如果[url absoluteString]恰好包含我想要的東西? – whyoz 2015-09-10 20:25:42