รับบางส่วนของ NSURL ในวัตถุประสงค์ -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 = 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

จับส่วนของคุณได้ดีเช่นกัน! ฉันไม่ได้ตรวจสอบด้วยซ้ำ
Dima

เราไม่มีชื่อไฟล์จากรายการหัวข้อย่อยหรือไม่? ในตัวอย่างfile.htmlนี้ไม่ได้ระบุไว้ในสัญลักษณ์แสดงหัวข้อย่อย - ฉันเห็นว่าเรากำลังกระโดดจากเส้นทางไปยังสตริงข้อความค้นหา ...
Brett

2
digg.com? โพสต์นี้อายุเท่าไหร่! ;-)
เลิกใช้งาน Darren

7

ใช้ Playground ภาษาที่รวดเร็วฉันได้สิ่งนี้! Playground เป็นวิธีการโต้ตอบในการมองเห็นสิ่งนี้ในการดำเนินการ ฉันหวังว่าคุณจะสนุกกับการทำแบบเดียวกันวิธีที่สนุกในการเรียนรู้ NSURL ซึ่งเป็นหัวข้อสำคัญใน iOS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.