J'ai une NSURL :
serverCall?x=a&y=b&z=c
Quel est le moyen le plus rapide et le plus efficace d'obtenir la valeur de y ?
Merci
J'ai une NSURL :
serverCall?x=a&y=b&z=c
Quel est le moyen le plus rapide et le plus efficace d'obtenir la valeur de y ?
Merci
UPDATE :
Depuis 2010, date à laquelle cet article a été rédigé, il semble qu'Apple ait publié un ensemble d'outils à cette fin. Veuillez consulter les réponses ci-dessous à ce sujet.
Une solution à l'ancienne :
Je sais que vous avez dit " le moyen le plus rapide "mais après avoir commencé à faire un test avec NSScanner
Je ne pouvais pas m'arrêter. Et même si ce n'est pas le chemin le plus court, c'est très pratique si vous prévoyez d'utiliser souvent cette fonction. J'ai créé un URLParser
qui récupère ces variables à l'aide d'un NSScanner
. L'utilisation est simple comme bonjour :
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
Et la classe qui fait cela est la suivante (*fichiers sources en bas de l'article) :
URLParser.h
@interface URLParser : NSObject {
NSArray *variables;
}
@property (nonatomic, retain) NSArray *variables;
- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;
@end
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
*Si vous n'aimez pas faire des copier-coller, vous pouvez simplement télécharger les fichiers sources - j'ai rédigé un bref article de blog à ce sujet. aquí .
Je suis presque sûr que vous devez l'analyser vous-même. Cependant, ce n'est pas si mal :
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"]);
J'ai utilisé cette catégorie : https://github.com/carlj/NSURL-Parameters .
Il est petit et facile à utiliser :
#import "NSURL+Parameters.h"
...
NSURL *url = [NSURL URLWithString:@"http://foo.bar.com?paramA=valueA¶mB=valueB"];
NSString *paramA = url[@"paramA"];
NSString *paramB = url[@"paramB"];
Vous pouvez utiliser Google Toolbox pour Mac. Elle ajoute une fonction à NSString pour convertir la chaîne de requête en dictionnaire.
http://code.google.com/p/google-toolbox-for-mac/
Il fonctionne comme un charme
NSDictionary * d = [NSDictionary gtm_dictionaryWithHttpArgumentsString:[[request URL] query]];
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.