Objective-CでNSURLの一部を取得する


114

値がNSStringの

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

3レベルの前にすべてを取得するにはどうすればよいですか?

http://digg.com/news/

回答:


435

これは第3レベルではありません。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-here
  • -[NSURL query] = foo = bar
  • -[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//
Dima

@ディマ、良いキャッチ。ただし、最初のスラッシュのみがパスコンポーネントと見なされ、他のスラッシュは破棄されます。理由はわかりませんが。
zneak 2012

あなたの側でも良いキャッチ!たった一つでチェックすることもしませんでした。
Dima

箇条書きリストにファイル名がありませんか?この例でfile.htmlは、は箇条書きにリストされていません-パスからクエリ文字列にジャンプしています...
Brett

2
digg.com?この投稿は何歳ですか?;-)
推奨のDarren

7

Playgroundを使用すると、言語をすばやく習得できます。 プレイグラウンドは、これを実際に見るインタラクティブな方法を提供します。NSURLをiOSの重要なトピックとして学ぶ楽しい方法で、同じことを楽しんでいただければ幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.