Вам может понравиться метод replaceOccurrencesOfString:withString:options:range:
класса NSMutableString
. Я решил это, написав категорию для NSURL
:
#import <Foundation/Foundation.h>
@interface NSURL (StripQuery)
// Returns a new URL with the query stripped out.
// Note: If there is no query, returns a copy of this URL.
- (NSURL *)URLByStrippingQuery;
@end
@implementation NSURL (StripQuery)
- (NSURL *)URLByStrippingQuery
{
NSString *query = [self query];
// Simply copy if there was no query. (query is nil if URL has no '?',
// and equal to @"" if it has a '?' but no query after.)
if (!query || ![query length]) {
return [self copy];
}
NSMutableString *urlString = [NSMutableString stringWithString:[self absoluteString]];
[urlString replaceOccurrencesOfString:query
withString:@""
options:NSBackwardsSearch
range:NSMakeRange(0, [urlString length])];
return [NSURL URLWithString:urlString];
}
@end
Таким образом, я могу отправить это сообщение существующим NSURL
объектам и вернуть мне новый NSURL
объект.
Я проверил это, используя этот код:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php?key1=val1&key2=val2"];
// NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php?"];
// NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php"];
NSURL *newURL = [url URLByStrippingQuery];
NSLog(@"Original URL: \"%@\"\n", [url absoluteString]);
NSLog(@"Stripped URL: \"%@\"\n", [newURL absoluteString]);
}
return 0;
}
и я получил следующий вывод (без меток времени):
Original URL: "http://www.example.com/script.php?key1=val1&key2=val2"
Stripped URL: "http://www.example.com/script.php?"
Обратите внимание, что знак вопроса ('?') Все еще остается. Я оставлю это на усмотрение читателя, чтобы удалить его безопасным способом.