Получить части NSURL в objective-c


114

У меня есть NSString со значением

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

Как я могу получить все до 3-го уровня?

http://digg.com/news/

Ответы:


435

Заметьте, это не совсем третий уровень. URL-адрес разделяется следующим образом:

  • протокол или схема (здесь http)
  • ://разделитель
  • имя пользователя и пароль (здесь их нет, но может быть username:password@hostname)
  • имя хоста (здесь digg.com)
  • порт (например, :80после имени домена)
  • путь (здесь /news/business/24hr)
  • строка параметров (все, что следует за точкой с запятой)
  • строка запроса (это было бы, если бы у вас были параметры GET, например ?foo=bar&baz=frob)
  • фрагмент (это было бы, если бы в ссылке был якорь, например #foobar).

"Полнофункциональный" URL-адрес будет выглядеть так:

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

NSURLимеет широкий выбор аксессуаров. Вы можете проверить их в документации к NSURLклассу, раздел Доступ к частям URL . Для быстрой справки:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (все от // до конца URL)
  • -[NSURL user] = foobar
  • -[NSURL password] = nicate
  • -[NSURL host] = example.com
  • -[NSURL port] = 8080
  • -[NSURL path] = /some/path/file.html
  • -[NSURL pathComponents] = @ ["/", "some", "path", "file.html"] (обратите внимание, что начальное / является его частью)
  • -[NSURL lastPathComponent] = file.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = params-здесь
  • -[NSURL query] = foo = бар
  • -[NSURL fragment] = baz

Однако вам нужно что-то вроде этого:

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

Для вашего примера URL-адреса вам, кажется, нужен протокол, хост и первый компонент пути. (Элемент с индексом 0 в массиве, возвращаемом функцией -[NSString pathComponents], просто "/", поэтому вам нужен элемент с индексом 1. Остальные косые черты отбрасываются.)


9
для всех, кто это читает: вам нужно получить [url.pathComponents objectAtIndex:1]вместо индекса 0, потому что косые черты на самом деле являются элементами массива, что приводит к выводу кода в этом ответеhttp://digg.com//
Дима

@ Дима, хороший улов. Однако только первая косая черта считается компонентом пути, остальные отбрасываются. Хотя я не знаю почему.
zneak 01

Хороший улов с твоей стороны! Я даже не проверял это на одном.
Дима

Нам не хватает имени файла в списке маркеров? В этом примереfile.html не указано в маркированном списке - я вижу, мы переходим от пути к строке запроса ...
Бретт,

2
digg.com? сколько лет этому посту! ;-)
Устаревший Даррен

7

Используя Playground, language swift, я получил это! Playground предоставляет интерактивный способ увидеть это в действии. Надеюсь, вам понравится делать то же самое - интересный способ изучить NSURL - важную тему в iOS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.