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/

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:nicate@example.com: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.)


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.