28 votes

iOS: analyser une URL en segments

Ce qui est une manière efficace de prendre une NSURL objet tel que le suivant:

foo://name/12345 

et la décomposer en une chaîne de caractères et un entier non signé, où la chaîne de val est " nom " et le unsigned int est 12345?

Je suis en supposant que l'algorithme consiste à convertir NSURL à un NSString puis de l'utilisation de certains composants de NSScanner pour finir le reste?

144voto

Nick Weaver Points 30418

Je ne peux qu'ajouter un exemple ici, la NSURL classe est la première à partir. Ce n'est pas complète, mais vous donnera une idée sur la façon d'utiliser 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]);

sortie:

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

Ce Q&A NSURL de parameterString confusion avec l'utilisation de ';' vs '&' est aussi intéressant concernant les Url.

14voto

Henri Normak Points 2609

NSURL a une méthode pathComponents, qui retourne un tableau avec tous les différents composants de chemin. Qui devrait vous aider à obtenir la partie entière. Pour obtenir le nom que j'avais utiliser l' host méthode de la NSURL. Les docs disent, que cela devrait fonctionner si l'URL est correctement formaté, pourrait aussi bien essayer alors.

Dans l'ensemble, pas besoin de convertir en chaîne de caractères, il semble y avoir beaucoup de méthodes pour travailler sur les composants de l'URL à partir de la NSURL objet lui-même.

0voto

Merci à Nick pour me pointer dans la bonne direction.

J'ai voulu comparer les url de fichiers, mais a eu des problèmes avec les extra-barres obliques en faisant isEqualString inutile. Vous pouvez utiliser mon exemple ci-dessous pour comparer les deux urls par le premier de les construire et de les comparer ensuite les pièces les unes contre les autres.

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

Prograide.com

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.

Powered by:

X