Iphone iOS:将URL解析为段

Iphone iOS:将URL解析为段,iphone,objective-c,ios,Iphone,Objective C,Ios,获取NSURL对象的有效方法是什么,例如: foo://name/12345 把它分成一个字符串和一个无符号整数,其中字符串val是'name',无符号int是12345 我假设算法涉及将NSURL转换为NSString,然后使用NSScanner的一些组件完成其余部分?NSURL有一个方法pathComponents,它返回一个包含所有不同路径组件的数组。这将有助于得到整数部分。要获得名称,我将使用NSURL的host方法。文档说,如果URL格式正确,它应该可以工作,那么不妨尝试一下 总而

获取NSURL对象的有效方法是什么,例如:

foo://name/12345 
把它分成一个字符串和一个无符号整数,其中字符串val是'name',无符号int是12345


我假设算法涉及将NSURL转换为NSString,然后使用NSScanner的一些组件完成其余部分?

NSURL有一个方法
pathComponents
,它返回一个包含所有不同路径组件的数组。这将有助于得到整数部分。要获得名称,我将使用NSURL的
host
方法。文档说,如果URL格式正确,它应该可以工作,那么不妨尝试一下


总而言之,不需要转换成字符串,似乎有很多方法可以从NSURL对象本身计算URL的组件。

我只能在这里添加一个示例,类就是其中之一。这还不完整,但会提示您如何使用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

关于URL,这个问答也很有趣。

感谢Nick为我指明了正确的方向

我想比较文件URL,但在额外的斜杠使isEqualString变得无用时遇到了问题。您可以使用我下面的示例来比较两个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;
}  

实际上,有一种更好的方法来解析NSURL。使用NSURL组件。下面是一个简单的例子:

Swift:

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
    }
}
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]];
    }
目标-C:

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

感谢您在我的经历中写下这篇文章,使用
pathComponents
是有风险的。事实上,如果您的路径组件包含<代码> /<代码>,甚至编码,则PATH组件将对其进行解码并将其视为分隔符。我更愿意自己解析路径组件。除了[url parameterString]之外,一切似乎都正常……如果[url absoluteString]正好包含我想要的内容,你知道为什么会是“(null)”吗?下面是所有NSURL组件的列表:这实际上也将parameterString显示为(null)?对于Swift
url
类型也是如此。