Nhận các phần của NSURL trong mục tiêu-c


114

Tôi có một chuỗi NSString với giá trị là

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

Làm thế nào tôi có thể nhận được mọi thứ trước khi cấp 3?

http://digg.com/news/

Câu trả lời:


435

Đây không phải là cấp độ thứ ba, phiền bạn. URL được chia theo cách đó:

  • giao thức hoặc lược đồ (tại đây, http)
  • các ://delimiter
  • tên người dùng và mật khẩu (ở đây không có bất kỳ, nhưng nó có thể là username:password@hostname)
  • tên máy chủ (tại đây, digg.com)
  • cổng ( :80ví dụ: đó sẽ là sau tên miền)
  • đường dẫn (đây, /news/business/24hr)
  • chuỗi tham số (bất kỳ thứ gì theo sau dấu chấm phẩy)
  • chuỗi truy vấn (đó là nếu bạn có các tham số GET như ?foo=bar&baz=frob)
  • đoạn (đó sẽ là nếu bạn có một mỏ neo trong liên kết, chẳng hạn như #foobar).

URL "đầy đủ tính năng" sẽ giống như sau:

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

NSURLcó nhiều loại người truy cập. Bạn có thể kiểm tra chúng trong tài liệu dành cho NSURLlớp, phần Truy cập các phần của URL . Để tham khảo nhanh:

  • -[NSURL scheme] = http
  • -[NSURL resourceSpecifier] = (mọi thứ từ // đến cuối 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"] (lưu ý rằng tên viết tắt / là một phần của nó)
  • -[NSURL lastPathComponent] = file.html
  • -[NSURL pathExtension] = html
  • -[NSURL parameterString] = params-here
  • -[NSURL query] = foo = thanh
  • -[NSURL fragment] = baz

Tuy nhiên, những gì bạn muốn là một cái gì đó như thế:

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

Đối với URL mẫu của bạn, những gì bạn có vẻ muốn là giao thức, máy chủ lưu trữ và thành phần đường dẫn đầu tiên. (Phần tử ở chỉ mục 0 trong mảng được trả về -[NSString pathComponents]đơn giản là "/", vì vậy bạn sẽ muốn phần tử ở chỉ mục 1. Các dấu gạch chéo khác bị loại bỏ.)


9
cho bất cứ ai đọc bài viết này: bạn cần phải nhận được [url.pathComponents objectAtIndex:1]thay vì chỉ số 0, bởi vì các dấu gạch chéo là thực sự yếu tố của mảng, gây ra các mã trong câu trả lời này đến đầu rahttp://digg.com//
Dima

@Dima, bắt tốt. Tuy nhiên, chỉ có dấu gạch chéo đầu tiên được coi là một thành phần của đường dẫn, các dấu gạch chéo khác bị loại bỏ. Tôi không chắc tại sao, mặc dù vậy.
zneak

bạn cũng nắm bắt tốt! Tôi thậm chí đã không kiểm tra nó chỉ với một.
Dima

Chúng tôi có thiếu tên tệp trong danh sách dấu đầu dòng không? Trong ví dụ này, file.htmlkhông được liệt kê trong các dấu đầu dòng - tôi thấy chúng ta đang nhảy từ đường dẫn đến chuỗi truy vấn ...
Brett

2
digg.com? bài viết này bao nhiêu tuổi! ;-)
Darren không được dùng nữa

7

Sử dụng Playground, ngôn ngữ nhanh chóng, tôi đã hiểu! Playground cung cấp một cách tương tác để nhìn thấy điều này trong hành động. Tôi hy vọng bạn có thể thích làm điều tương tự, một cách thú vị để học NSURL, một chủ đề quan trọng trong iOS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.