Obtenha partes de um NSURL no objetivo-c

114

Eu tenho um NSString com o valor de

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

Como posso obter tudo antes do 3º nível?

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

Respostas:

435

Este não é exatamente o terceiro nível, veja bem. Um URL é dividido assim:

  • o protocolo ou esquema (aqui, http)
  • o ://delimitador
  • o nome de usuário e a senha (aqui não há, mas pode ser username:password@hostname)
  • o nome do host (aqui, digg.com)
  • a porta (que seria :80após o nome de domínio, por exemplo)
  • o caminho (aqui, /news/business/24hr)
  • a string de parâmetro (qualquer coisa que siga um ponto-e-vírgula)
  • a string de consulta (isso seria se você tivesse parâmetros GET como ?foo=bar&baz=frob)
  • o fragmento (isso seria se você tivesse uma âncora no link, como #foobar).

Um URL "completo" seria assim:

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

NSURLtem uma ampla gama de acessores. Você pode verificá-los na documentação da NSURLclasse, seção Acessando as partes da URL . Para referência rápida:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (tudo de // até o final do URL)
  • -[NSURL user] = foobar
  • -[NSURL password] = nicate
  • -[NSURL host] = exemplo.com
  • -[NSURL port] = 8080
  • -[NSURL path] = /some/path/file.html
  • -[NSURL pathComponents] = @ ["/", "algum", "caminho", "arquivo.html"] (observe que a inicial / é parte dela)
  • -[NSURL lastPathComponent] = file.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = params-aqui
  • -[NSURL query] = foo = bar
  • -[NSURL fragment] = baz

O que você vai querer, porém, é algo assim:

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

Para o seu URL de exemplo, o que você parece querer é o protocolo, o host e o primeiro componente do caminho. (O elemento no índice 0 na matriz retornada por -[NSString pathComponents]é simplesmente "/", então você vai querer o elemento no índice 1. As outras barras são descartadas.)

zneak
fonte
9
para qualquer um que esteja lendo isso: você precisa obter em [url.pathComponents objectAtIndex:1]vez de índice 0, porque as barras são na verdade elementos da matriz, fazendo com que o código nesta resposta seja geradohttp://digg.com//
Dima
@Dima, boa pegada. No entanto, apenas a primeira barra é considerada um componente do caminho, as outras são descartadas. Não tenho certeza do porquê, no entanto.
zneak 01 de
boa pegada de sua parte também! Eu nem chequei com apenas um.
Dima,
O nome do arquivo está faltando na lista de marcadores? Neste exemplo, file.htmlnão está listado nos marcadores - vejo que estamos pulando do caminho para a string de consulta ...
Brett,
2
digg.com? quantos anos tem este post! ;-)
Obsoleto Darren de
7

Usando Playground, linguagem rápida, eu consegui! O Playground oferece uma maneira interativa de ver isso em ação. Espero que você goste de fazer o mesmo, uma maneira divertida de aprender NSURL, um tópico importante no iOS.

Kumar Utsav
fonte