Ottieni parti di una NSURL nell'obiettivo-c


114

Ho un NSString con il valore di

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

Come posso ottenere tutto prima del 3 ° livello?

http://digg.com/news/

Risposte:


435

Questo non è esattamente il terzo livello, intendiamoci. Un URL è suddiviso in questo modo:

  • il protocollo o lo schema (qui http)
  • il ://delimitatore
  • il nome utente e la password (qui non ce n'è, ma potrebbe essere username:password@hostname)
  • il nome host (qui, digg.com)
  • il porto (sarebbe :80 ad esempio dopo il nome del dominio)
  • il percorso (qui /news/business/24hr)
  • la stringa del parametro (tutto ciò che segue un punto e virgola)
  • la stringa di query (sarebbe se avessi parametri GET come ?foo=bar&baz=frob)
  • il frammento (sarebbe se avessi un'ancora nel collegamento, come #foobar).

Un URL "con funzionalità complete" sarebbe simile al seguente:

http://foobar:nicate@example.com:8080/some/path/file.html;params-here?foo=bar#baz

NSURLha una vasta gamma di accessori. Puoi controllarli nella documentazione per la NSURLclasse, sezione Accesso alle parti dell'URL . Per una rapida consultazione:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (tutto da // alla fine dell'URL)
  • -[NSURL user] = foobar
  • -[NSURL password] = nicato
  • -[NSURL host] = esempio.com
  • -[NSURL port] = 8080
  • -[NSURL path] = /some/path/file.html
  • -[NSURL pathComponents] = @ ["/", "some", "path", "file.html"] (nota che l'iniziale / ne fa parte)
  • -[NSURL lastPathComponent] = file.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = params-qui
  • -[NSURL query] = foo = bar
  • -[NSURL fragment] = baz

Quello che vorrai, però, è qualcosa del genere:

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

Per il tuo URL di esempio, ciò che sembri desiderare è il protocollo, l'host e il primo componente del percorso. (L'elemento all'indice 0 nell'array restituito da -[NSString pathComponents]è semplicemente "/", quindi ti consigliamo l'elemento all'indice 1. Le altre barre vengono scartate.)


9
per chiunque legga questo: è necessario ottenere [url.pathComponents objectAtIndex:1]invece di index 0, perché le barre sono in realtà elementi dell'array, causando l'output del codice in questa rispostahttp://digg.com//
Dima

@Dima, buona cattura. Tuttavia, solo la prima barra è considerata un componente del percorso, le altre vengono scartate. Non sono sicuro del perché, però.
zneak

buona cattura anche da parte tua! Non l'ho nemmeno controllato con uno solo.
Dima

Manca il nome del file dall'elenco puntato? In questo esempio, file.htmlnon è elencato nei punti elenco: vedo che stiamo saltando dal percorso alla stringa di query ...
Brett

2
digg.com? quanti anni ha questo post! ;-)
Deprecato Darren l'

7

Usando Playground, language swift, ho capito! Playground offre un modo interattivo per vederlo in azione. Spero che tu possa divertirti a fare lo stesso, un modo divertente per imparare NSURL, un argomento importante in iOS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.