NSURL为参数字符串中的键提取单个值

Dav*_*ave 42 nsurl

我有一个NSURL:

serverCall?X = A&Y = B&Z = C

获得y值的最快捷,最有效的方法是什么?

谢谢

Dim*_*ris 79

更新:

自2010年编写本文以来,Apple似乎已经发布了一套用于此目的的工具.请参阅下面的答案.

老派解决方案:

嗯,我知道你说" 最快捷的方式 ",但在我开始做测试之后我NSScanner就无法停止.虽然它不是最短的方式,但如果你计划大量使用这个功能,它肯定很方便.我创建了一个URLParser使用a 获取这些变量的类NSScanner.用法很简单:

URLParser *parser = [[[URLParser alloc] initWithURLString:@"http://blahblahblah.com/serverCall?x=a&y=b&z=c&flash=yes"] autorelease];
NSString *y = [parser valueForVariable:@"y"];
NSLog(@"%@", y); //b
NSString *a = [parser valueForVariable:@"a"];
NSLog(@"%@", a); //(null)
NSString *flash = [parser valueForVariable:@"flash"];
NSLog(@"%@", flash); //yes
Run Code Online (Sandbox Code Playgroud)

执行此操作的类如下(*帖子底部的*源文件):

URLParser.h

@interface URLParser : NSObject {
    NSArray *variables;
}

@property (nonatomic, retain) NSArray *variables;

- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;

@end
Run Code Online (Sandbox Code Playgroud)

URLParser.m

@implementation URLParser
@synthesize variables;

- (id) initWithURLString:(NSString *)url{
    self = [super init];
    if (self != nil) {
        NSString *string = url;
        NSScanner *scanner = [NSScanner scannerWithString:string];
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
        NSString *tempString;
        NSMutableArray *vars = [NSMutableArray new];
        [scanner scanUpToString:@"?" intoString:nil];       //ignore the beginning of the string and skip to the vars
        while ([scanner scanUpToString:@"&" intoString:&tempString]) {
            [vars addObject:[tempString copy]];
        }
        self.variables = vars;
        [vars release];
    }
    return self;
}

- (NSString *)valueForVariable:(NSString *)varName {
    for (NSString *var in self.variables) {
        if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
            NSString *varValue = [var substringFromIndex:[varName length]+1];
            return varValue;
        }
    }
    return nil;
}

- (void) dealloc{
    self.variables = nil;
    [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)

*如果你不喜欢复制和粘贴,你可以下载源文件 - 我在这里发了一篇关于这个的快速博客文章.

  • +1真棒!"NSScanner"是一个我没有玩过的课程,这看起来非常有趣.我要说的唯一注释是不要调用方法`getValue ...`.这意味着(按照惯例)你将通过out参数返回值.`valueForVariable:`将是正确的名称. (4认同)

and*_*ers 66

这里有很多自定义网址解析器,请记住NSURLComponents是你的朋友!

这是一个示例,我为"页面"提取了一个url编码参数

迅速

let myURL = "www.something.com?page=2"

var pageNumber : Int?
if let queryItems = NSURLComponents(string: myURL)?.queryItems {
    for item in queryItems {
        if item.name == "page" {
           if let itemValue = item.value {
               pageNumber = Int(itemValue)
           }
        }
    }
}
print("Found page number: \(pageNumber)")
Run Code Online (Sandbox Code Playgroud)

Objective-C的

NSString *myURL = @"www.something.com?page=2";
NSURLComponents *components = [NSURLComponents componentsWithString:myURL];
NSNumber *page = nil;
for(NSURLQueryItem *item in components.queryItems)
{
    if([item.name isEqualToString:@"page"])
        page = [NSNumber numberWithInteger:item.value.integerValue];
}
Run Code Online (Sandbox Code Playgroud)

"为什么重新发明轮子!" - 有人聪明

  • 实际上我不明白为什么这个答案没有标记为更正的答案.谢谢@anders. (3认同)

Dav*_*ong 19

我很确定你必须自己解析它.但是,它并不太糟糕:

NSString * q = [myURL query];
NSArray * pairs = [q componentsSeparatedByString:@"&"];
NSMutableDictionary * kvPairs = [NSMutableDictionary dictionary];
for (NSString * pair in pairs) {
  NSArray * bits = [pair componentsSeparatedByString:@"="];
  NSString * key = [[bits objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSString * value = [[bits objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  [kvPairs setObject:value forKey:key];
}

NSLog(@"y = %@", [kvPairs objectForKey:@"y"]);
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`NSUTF8StringEncoding`而不是`NSASCIIStringEncoding`,除非你讨厌非英语人士. (8认同)

lea*_*ter 11

在Swift中,您可以使用NSURLComponents将NSURL的查询字符串解析为[AnyObject].

然后,您可以从中创建字典(或直接访问项目)以获取键/值对.作为示例,这是我用来解析NSURL变量url的内容:

let urlComponents = NSURLComponents(URL: url, resolvingAgainstBaseURL: false)
let items = urlComponents?.queryItems as [NSURLQueryItem]
var dict = NSMutableDictionary()
for item in items{
    dict.setValue(item.value, forKey: item.name)
}
println(dict["x"])
Run Code Online (Sandbox Code Playgroud)


Tro*_*roy 10

我一直在使用这个类别:https://github.com/carlj/NSURL-Parameters.

它体积小,易于使用:

#import "NSURL+Parameters.h"
...
NSURL *url = [NSURL URLWithString:@"http://foo.bar.com?paramA=valueA&paramB=valueB"];
NSString *paramA = url[@"paramA"];
NSString *paramB = url[@"paramB"];
Run Code Online (Sandbox Code Playgroud)