본문 바로가기

Programming/iOS

[ios] #태그 감지하고 링크 걸기

반응형
텍스트뷰나 라벨에서 해시태그를 감기 하기 위해선, 정규 표현식이 필요합니다.

Objective-C 에서는 NSRegularExpression를 통해서 정규식 표현을 하고 감지를 할수 있습니다.



-------------------------------------------------------------------------------------------------------------------------------------------

1. NSRegularExpression 객체를 생성하고, regularExpressionWithPattern에 정규식을 넣습니다.



 NSError *error = nil;
 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error];
    
-------------------------------------------------------------------------------------------------------------------------------------------

2. enumerateMatchesInString:text 함수를 이용하여, 매칭되는 객체는 NSTextCheckingResult에 저장되고, 사용할수 있습니다.

[regex enumerateMatchesInString:text                            options:0                              range:NSMakeRange(0, [text length])                         usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {                                                          //                             NSLog(@"Ranges: %ld", (unsigned long)[match numberOfRanges]);                                                          NSString *matchFull = [text substringWithRange:[match range]];                             //                             NSLog(@"Match: %@", matchFull);                         }];

-------------------------------------------------------------------------------------------------------------------------------------------

3. matchFull 객체에는 정규식으로 넣은 객체와 일치하는 객체를 반환합니다. 
해당 객체들을 링크를 걸려면,아래의 함수를 이용하여 링크를 넣을수 있습니다.

- (void)addLink:(NSString *)link linkColor:(UIColor *)linkColor text:(NSString *)text {


    NSString *pattern = [NSString stringWithFormat:@"(%@)", text];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
    
    NSArray<NSTextCheckingResult *> *matches = [regex matchesInString:self.mutableString options:0 range:NSMakeRange(0, self.length)];
    
    for (NSTextCheckingResult *result in matches) {
        [self addAttribute:NSLinkAttributeName value:link range:[result rangeAtIndex:0]];
        [self addAttribute:NSForegroundColorAttributeName value:linkColor range:[result rangeAtIndex:0]];
    }
}