2011-05-05 50 views
35

什麼是採取NSURL對象的有效方式,如下列:的iOS:解析URL成段

foo://name/12345 

,並把它分解成一個字符串和一個無符號整數,字符串val爲「名'和無符號整數是12345?

我假設該算法涉及將NSURL轉換爲NSString,然後使用NSScanner的某些組件完成其餘部分?

回答

19

NSURL有一個方法pathComponents,它返回一個包含所有不同路徑組件的數組。這應該可以幫助你獲得整數部分。要獲得名稱,我會使用NSURL的host方法。該文檔說,它應該工作,如果URL格式正確,不妨嘗試一下。

總而言之,不需要轉換成字符串,似乎有很多方法可以從NSURL對象本身計算URL的組件。

179

我只能在這裏添加一個例子,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 '&'也很有趣關於網址。

+0

感謝寫這一切了 – Sneakyness 2013-01-25 23:16:14

+1

根據我的經驗,使用'pathComponents'是有風險。事實上,如果你的路徑組件包含一個'/',EVEN ENCODED,pathComponents將會對它進行解碼並將其視爲分隔符。我寧願自己解析路徑組件。 – 2015-01-23 10:06:34

+0

似乎除了[url parameterString] ...之外,任何想法爲什麼這可能是「(null)」,如果[url absoluteString]恰好包含我想要的東西? – whyoz 2015-09-10 20:25:42

0

感謝尼克指出我在正確的方向。

我想比較文件的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; 
} 
8

實際上有一個更好的方法來解析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]]; 
    } 
+0

謝謝,這對我工作:-) – 2017-05-03 10:52:22