Tôi đang viết một ứng dụng Cocoa, sử dụng NSURLs - tôi cần xóa phần đoạn của URL (phần #BLAH).Xóa phân đoạn url khỏi NSURL
dụ: http://example.com/#blah nên kết thúc như http://example.com/
Tôi tìm thấy một số mã trong WebCore mà dường như để làm điều đó bằng cách sử dụng chức năng CFURL, nhưng nó không bao giờ tìm thấy phần đoạn trong URL. Tôi đã đóng gói nó trong một thể loại mở rộng:
-(NSURL *)urlByRemovingComponent:(CFURLComponentType)component {
CFRange fragRg = CFURLGetByteRangeForComponent((CFURLRef)self, component, NULL);
// Check to see if a fragment exists before decomposing the URL.
if (fragRg.location == kCFNotFound)
return self;
UInt8 *urlBytes, buffer[2048];
CFIndex numBytes = CFURLGetBytes((CFURLRef)self, buffer, 2048);
if (numBytes == -1) {
numBytes = CFURLGetBytes((CFURLRef)self, NULL, 0);
urlBytes = (UInt8 *)(malloc(numBytes));
CFURLGetBytes((CFURLRef)self, urlBytes, numBytes);
} else
urlBytes = buffer;
NSURL *result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingUTF8, NULL));
if (!result)
result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingISOLatin1, NULL));
if (urlBytes != buffer) free(urlBytes);
return result ? [result autorelease] : self;
}
-(NSURL *)urlByRemovingFragment {
return [self urlByRemovingComponent:kCFURLComponentFragment];
}
này được sử dụng như vậy:
NSURL *newUrl = [[NSURL URLWithString:@"http://example.com/#blah"] urlByRemovingFragment];
không may, NEWURL kết thúc lên được "http://example.com/#blah" vì dòng đầu tiên trong urlByRemovingComponent luôn trả kCFNotFound
Tôi bị bối rối. Có cách nào tốt hơn để thực hiện việc này không?
Mã làm việc, nhờ Nall
-(NSURL *)urlByRemovingFragment {
NSString *urlString = [self absoluteString];
// Find that last component in the string from the end to make sure to get the last one
NSRange fragmentRange = [urlString rangeOfString:@"#" options:NSBackwardsSearch];
if (fragmentRange.location != NSNotFound) {
// Chop the fragment.
NSString* newURLString = [urlString substringToIndex:fragmentRange.location];
return [NSURL URLWithString:newURLString];
} else {
return self;
}
}
gần. dường như lastPathComponent trả về mảnh, và là một phương thức NSString. Tôi đã đăng mã cuối cùng cho câu hỏi. – pixel
NSURL cũng có phần tử lastPathComponent không trả về đoạn, nhưng nó là 10.6+ http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html# // apple_ref/doc/uid/20000301-SW22 – nall
có vấn đề gì với url.fragment? – Sam