[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]];
    }
}








댓글

주간 인기글

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #1

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #2

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기