使用NSRegularExpression创建自定义NSDataDetector类型

时间:2014-08-15 16:55:52

标签: ios objective-c uiwebview nsregularexpression

我正在尝试为UITextView中的内容创建自定义数据检测器。我希望能够做到这样的事情:

tv.dataDetectorTypes = UIDataDetectorTypeAll;

但是我想使用基于以下正则表达式的自定义UIDataDetector而不是UIDataDetectorTypeAll:

    NSError *error = nil;        
    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"(ID: [0-9]+)"
                                                                      options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

我还希望检测到的ID是一个链接,它将带有URL + ID组合(http://www.stack.com?id)的UIWebView推送到导航堆栈。应该只有一个id。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这花了我一整天,我终于找到并修改了这个Ray Wenderlich解决方案。显然,这是iOS 7中一个非常模糊的新功能。

- (NSAttributedString *)makeAttributedAbstract:(NSString*)str
{
    NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:str];

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(PMID: [0-9]+)" options:kNilOptions error:nil];

    NSRange range = NSMakeRange(0, str.length);

    [regex enumerateMatchesInString:str options:kNilOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSRange subStringRange = [result rangeAtIndex:1];
        [mutableAttributedString addAttribute:NSLinkAttributeName value:@"pmid://" range:subStringRange];
    }];

    return (NSAttributedString*)mutableAttributedString;
}


- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    if ([[URL scheme] isEqualToString:@"pmid"]) {

        NSString *pmid = [NSString stringWithFormat:@"http://www.ncbi.nlm.nih.gov/pubmed/%@", [self.sql getPmidForId:self.abstractId] ];

        NSURL *url = [NSURL URLWithString:pmid];
                NSLog(@"pmid: %@", url);
        [self pushWebViewWithURL:url];

        return NO;
    }
    return YES; // let the system open this URL
}

http://www.raywenderlich.com/48001/easily-overlooked-new-features-ios-7#textViewLinks

答案 1 :(得分:0)

我认为您必须解决此问题,因为NSDataDetector仅限于预设。

看看这个答案https://stackoverflow.com/a/19397842/2085504