Objective-C - Поиск URL-адреса внутри строки

Учитывая большую строку, какой лучший способ создать массив всех допустимых URL-адресов, которые содержатся в строке?

Ответы

Ответ 1

Не нужно использовать RegexKitLite для этого, так как iOS 4 Apple предоставляет NSDataDetector (подкласс NSRegularExpression).

Вы можете использовать его просто так (source - ваша строка):

NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches = [detector matchesInString:source options:0 range:NSMakeRange(0, [source length])];

Ответ 2

Я бы использовал RegexKitLite для этого:

#import "RegExKitLite.h"

...

NSString * urlString = @"blah blah blah http://www.google.com blah blah blah http://www.stackoverflow.com blah blah balh http://www.apple.com";
NSArray *urls = [urlString componentsMatchedByRegex:@"http://[^\\s]*"];
NSLog(@"urls: %@", urls);

Печать

urls: (
    "http://www.google.com",
    "http://www.stackoverflow.com",
    "http://www.apple.com"
)

(Конечно, регулярное выражение, которое я использовал там для URL-адресов, упрощено, но вы получаете идею.)

Ответ 3

Это лучший способ извлечь URL-ссылку.

NSString *url_ = @"dkc://name.com:8080/123;param?id=123&pass=2#fragment";

NSURL *url = [NSURL URLWithString:url_];

NSLog(@"scheme: %@", [url scheme]);

NSLog(@"host: %@", [url host]);

NSLog(@"port: %@", [url port]);

NSLog(@"path: %@", [url path]);

NSLog(@"path components: %@", [url pathComponents]);

NSLog(@"parameterString: %@", [url parameterString]);

NSLog(@"query: %@", [url query]);

NSLog(@"fragment: %@", [url fragment]);

Вывод:

схема: dkc

host: name.com

порт: 8080

путь:/12345

компоненты пути: (      "/",     123) параметрString: param

query: id = 1 & pass = 2

фрагмент: фрагмент