iOS:将URL解析为段

ran*_*its 41 iphone objective-c ios

获取NSURL对象的有效方法如下:

foo://name/12345 
Run Code Online (Sandbox Code Playgroud)

并将其分解为一个字符串和一个无符号整数,其中字符串val是'name'而unsigned int是12345?

我假设算法涉及将NSURL转换为NSString,然后使用NSScanner的某些组件来完成剩下的工作?

Nic*_*ver 190

我只能在这里添加一个例子,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]);
Run Code Online (Sandbox Code Playgroud)

输出:

scheme: foo
host: name.com
port: 8080
path: /12345
path components: (
    "/",
    12345
)
parameterString: param
query: foo=1&baa=2
fragment: fragment
Run Code Online (Sandbox Code Playgroud)

这个Q&A NSURL的参数串与使用';'混淆 vs'&'对于URL也很有趣.


Hen*_*mak 19

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

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


And*_*gin 11

实际上有一种更好的方法来解析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
    }
}
Run Code Online (Sandbox Code Playgroud)

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]];
    }
Run Code Online (Sandbox Code Playgroud)