2010-12-29 5 views
1

텍스트 본문에서 URL을 찾는 알고리즘을 찾으려고합니다. 저는 현재 다음과 같은 코드가 (이 아래로 내 앉아 있었고 코드를 그것을 해킹 내가 더 나은 방법이 있어야한다 알고) :텍스트 본문에서 URL을 찾는 알고리즘 개선 - obj-c

statusText.text = @"http://google.com http://www.apple.com www.joshholat.com"; 

NSMutableArray *urlLocations = [[NSMutableArray alloc] init]; 

NSRange currentLocation = NSMakeRange(0, statusText.text.length); 
for (int x = 0; x < statusText.text.length; x++) { 
    currentLocation = [[statusText.text substringFromIndex:(x + currentLocation.location)] rangeOfString:@"http://"]; 
    if (currentLocation.location > statusText.text.length) break; 
    [urlLocations addObject:[NSNumber numberWithInt:(currentLocation.location + x)]]; 
} 
currentLocation = NSMakeRange(0, statusText.text.length); 
for (int x = 0; x < statusText.text.length; x++) { 
    currentLocation = [[statusText.text substringFromIndex:(x + currentLocation.location)] rangeOfString:@"http://www."]; 
    if (currentLocation.location > statusText.text.length) break; 
    [urlLocations addObject:[NSNumber numberWithInt:(currentLocation.location + x)]]; 
} 
currentLocation = NSMakeRange(0, statusText.text.length); 
for (int x = 0; x < statusText.text.length; x++) { 
    currentLocation = [[statusText.text substringFromIndex:(x + currentLocation.location)] rangeOfString:@" www." options:NSLiteralSearch]; 
    if (currentLocation.location > statusText.text.length) break; 
    [urlLocations addObject:[NSNumber numberWithInt:(currentLocation.location + 1 + x)]]; 
} 

//Get rid of any duplicate locations 
NSSet *uniqueElements = [NSSet setWithArray:urlLocations]; 
[urlLocations release]; 
NSArray *finalURLLocations = [[NSArray alloc] init]; 
finalURLLocations = [uniqueElements allObjects]; 

//Parse out the URLs of each of the locations 
for (int x = 0; x < [finalURLLocations count]; x++) { 
    NSRange temp = [[statusText.text substringFromIndex:[[finalURLLocations objectAtIndex:x] intValue]] rangeOfString:@" "]; 
    int length = temp.location + [[finalURLLocations objectAtIndex:x] intValue]; 
    if (temp.location > statusText.text.length) length = statusText.text.length; 
    length = length - [[finalURLLocations objectAtIndex:x] intValue]; 
    NSLog(@"URL: %@", [statusText.text substringWithRange:NSMakeRange([[finalURLLocations objectAtIndex:x] intValue], length)]); 
} 

는 정규 표현식의 사용을 통해 개선 될 수 같은 느낌을 또는 뭔가. 이 문제를 개선하는 데 큰 도움이 될 것입니다.

답변

5

iOS 4.0 이상을 타겟팅하는 경우 Apple에서 대신 작업을 수행하고 기본 제공 데이터 감지기를 사용해야합니다. NSTextCheckingTypeLink 옵션을 사용하여 NSDataDetector의 인스턴스를 만들고 문자열 위에 실행하십시오. documentation for NSDataDetector에는 클래스 사용법에 대한 좋은 예가 있습니다. 당신은/어떤 이유로 데이터 탐지기를 사용할 수 없습니다, 존 그루버 (John Gruber)는 몇 달 전에 URL을 검출하는 좋은 정규식 패턴을 올렸습니다하지 않는 경우

: http://daringfireball.net/2010/07/improved_regex_for_matching_urls

+0

정확한 정규식 링크를 게시하려면 여기로 왔습니다. – extremeboredom

+0

NSDataDetector 정확히 내가 뭘 찾고 있었는지, 그 덕분에 톤! 내 알고리즘을 10 줄의 코드가 마음에 들도록 할 수있었습니다. 그것이 존재한다는 것을 몰랐습니다. – joshholat

1

을 그냥 후속으로, 여기에 무엇을의 내 코드가 다음으로 변경되었습니다.

statusText.text = @"http://google.com http://www.apple.com www.joshholat.com hey there google.com"; 

NSError *error = NULL; 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]; 

NSArray *matches = [detector matchesInString:statusText.text 
            options:0 
             range:NSMakeRange(0, statusText.text.length)]; 

for (NSTextCheckingResult *match in matches) { 
    if ([match resultType] == NSTextCheckingTypeLink) { 
     NSLog(@"URL: %@", [[match URL] absoluteURL]); 
    } 
}