Obtener partes de una NSURL en objetivo-c

114

Tengo un NSString con el valor de

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

¿Cómo puedo conseguir todo antes del 3er nivel?

http://digg.com/news/
Melina
fuente

Respuestas:

435

Este no es exactamente el tercer nivel, eso sí. Una URL se divide de esa manera:

  • el protocolo o esquema (aquí, http)
  • el ://delimitador
  • el nombre de usuario y la contraseña (aquí no hay ninguno, pero podría ser username:password@hostname)
  • el nombre de host (aquí, digg.com)
  • el puerto (que sería :80 después del nombre de dominio, por ejemplo)
  • el camino (aquí, /news/business/24hr)
  • la cadena de parámetros (cualquier cosa que siga a un punto y coma)
  • la cadena de consulta (eso sería si tuviera parámetros GET como ?foo=bar&baz=frob)
  • el fragmento (eso sería si tuvieras un ancla en el enlace, como #foobar).

Una URL "con todas las funciones" se vería así:

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

NSURLtiene una amplia gama de accesos. Puede consultarlos en la documentación de la NSURLclase, sección Acceso a las partes de la URL . Para referencia rápida:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (todo desde // hasta el final de la URL)
  • -[NSURL user] = foobar
  • -[NSURL password] = nicate
  • -[NSURL host] = ejemplo.com
  • -[NSURL port] = 8080
  • -[NSURL path] = /some/path/file.html
  • -[NSURL pathComponents] = @ ["/", "algunos", "ruta", "archivo.html"] (tenga en cuenta que la inicial / es parte de ella)
  • -[NSURL lastPathComponent] = archivo.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = params-here
  • -[NSURL query] = foo = bar
  • -[NSURL fragment] = baz

Sin embargo, lo que querrás es algo así:

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

Para su URL de ejemplo, lo que parece querer es el protocolo, el host y el primer componente de ruta. (El elemento en el índice 0 en la matriz devuelta por -[NSString pathComponents]es simplemente "/", por lo que querrá el elemento en el índice 1. Las otras barras se descartan).

zneak
fuente
9
para cualquiera que lea esto: debe obtener en [url.pathComponents objectAtIndex:1]lugar de índice 0, porque las barras diagonales son en realidad elementos de la matriz, lo que hace que el código de esta respuesta se muestrehttp://digg.com//
Dima
@Dima, buen partido. Sin embargo, solo la primera barra se considera un componente de ruta, las demás se descartan. Aunque no estoy seguro de por qué.
Zneak
¡Buena captura de tu parte también! Ni siquiera lo comprobé con solo uno.
Dima
¿Nos falta el nombre del archivo en la lista de viñetas? En este ejemplo, file.htmlno aparece en las viñetas; veo que estamos saltando de la ruta a la cadena de consulta ...
Brett
2
digg.com? ¿Qué edad tiene esta publicación? ;-)
Darren obsoleto
7

Usando Playground, lenguaje rápido, ¡lo tengo! Playground proporciona una forma interactiva de ver esto en acción. Espero que disfrutes haciendo lo mismo, una forma divertida de aprender NSURL, un tema importante en iOS.

Kumar Utsav
fuente