Obtenir des parties d'une NSURL dans objective-c

114

J'ai une NSString avec la valeur de

http://digg.com/news/business/24hr

Comment puis-je tout obtenir avant le 3e niveau?

http://digg.com/news/
Melina
la source

Réponses:

435

Ce n'est pas exactement le troisième niveau, remarquez. Une URL est divisée de cette façon:

  • le protocole ou le schéma (ici, http)
  • le ://délimiteur
  • le nom d'utilisateur et le mot de passe (ici il n'y en a pas, mais ça pourrait être username:password@hostname)
  • le nom d'hôte (ici, digg.com)
  • le port (qui serait :80après le nom de domaine par exemple)
  • le chemin (ici, /news/business/24hr)
  • la chaîne de paramètres (tout ce qui suit un point-virgule)
  • la chaîne de requête (ce serait si vous aviez des paramètres GET comme ?foo=bar&baz=frob)
  • le fragment (ce serait si vous aviez une ancre dans le lien, comme #foobar).

Une URL "complète" ressemblerait à ceci:

http://foobar:[email protected]:8080/some/path/file.html;params-here?foo=bar#baz

NSURLdispose d'un large éventail d'accesseurs. Vous pouvez les consulter dans la documentation de la NSURLclasse, section Accéder aux parties de l'URL . Pour référence rapide:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (tout de // à la fin de l'URL)
  • -[NSURL user] = foobar
  • -[NSURL password] = niquer
  • -[NSURL host] = example.com
  • -[NSURL port] = 8080
  • -[NSURL path] = /some/path/file.html
  • -[NSURL pathComponents] = @ ["/", "some", "path", "file.html"] (notez que l'initiale / en fait partie)
  • -[NSURL lastPathComponent] = fichier.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = paramètres-ici
  • -[NSURL query] = toto = bar
  • -[NSURL fragment] = baz

Ce que vous voudrez, cependant, c'est quelque chose comme ça:

NSURL* url = [NSURL URLWithString:@"http://digg.com/news/business/24hr"];
NSString* reducedUrl = [NSString stringWithFormat:
    @"%@://%@/%@",
    url.scheme,
    url.host,
    url.pathComponents[1]];

Pour votre exemple d'URL, ce que vous semblez vouloir, c'est le protocole, l'hôte et le premier composant de chemin. (L'élément à l'index 0 dans le tableau renvoyé par -[NSString pathComponents]est simplement "/", vous voudrez donc l'élément à l'index 1. Les autres barres obliques sont supprimées.)

zneak
la source
9
pour quiconque lit ceci: vous devez obtenir à la [url.pathComponents objectAtIndex:1]place de l'index 0, car les barres obliques sont en fait des éléments du tableau, ce qui entraîne la sortie du code de cette réponsehttp://digg.com//
Dima
@Dima, bonne prise. Cependant, seule la première barre oblique est considérée comme un composant de chemin, les autres sont ignorées. Je ne sais pas pourquoi, cependant.
zneak
bonne prise de votre part aussi! Je ne l'ai même pas vérifié avec un seul.
Dima
Avons-nous oublié le nom de fichier dans la liste à puces? Dans cet exemple, file.htmln'est pas répertorié dans les puces - je vois que nous sautons du chemin à la chaîne de requête ...
Brett
2
digg.com? quel âge a ce poste! ;-)
Darren
7

En utilisant Playground, langage rapide, j'ai compris! Playground offre une manière interactive de voir cela en action. J'espère que vous pourrez faire de même, une façon amusante d'apprendre NSURL, un sujet important dans iOS.

Kumar Utsav
la source