NSDataDetectorで電話番号を簡単に検索してみる

objective-cでテキスト内のURLと電話番号を簡単に検索してみました。

使ったのはiOS4以上で使える「NSRegularExpression」のサブクラス「NSDataDetector」です。

「NSDataDetector」は住所、電話番号、URL等を複数組み合わせて、文字列から検索できます。

複雑な正規表現を書かなくても、サクッとリンクと電話番号を検出できるので便利です。

適当なお試しコードをviewDidLoadに書いてみました。

- (void)viewDidLoad
{
    [super viewDidLoad];

    //検索する元になる文字列
    NSString *baseString;
    
    //テスト用のURLと電話番号を用意
    baseString = @"テスト用のURLです。http://d.hatena.ne.jp/tanaponchikidun/20120528/1338219772 が前のエントリです テスト用の電話番号です。090-0000-0000";

    //NSDataDetectorのクラスメソッドで検出したいチェックタイプを指定、|で複数指定可能
    NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink|
                                                                         NSTextCheckingTypePhoneNumber
                                                                   error:nil]; 
    //チェックでマッチした結果がまとめて返ってくる
    NSArray *matches = [linkDetector matchesInString:baseString
                                             options:0
                                               range:NSMakeRange(0,[baseString length])];
    
    //結果を1件ずつ比較する
    for (NSTextCheckingResult *match in matches) {
        //Linkにマッチしたら
        if ([match resultType] == NSTextCheckingTypeLink) {
            NSURL *url = [match URL];
            NSLog(@"url:%@",[url description]);
        } else if ([match resultType] == NSTextCheckingTypePhoneNumber) {
            NSString *phoneNumber = [match phoneNumber];
            NSLog(@"tel:%@",phoneNumber);
        }
    }
    /** 
     * 実行結果 URLと電話番号が検出できた
     
     * 2012-06-07 23:42:18.897 RegexTest[1324:f803] 
     * url:http://d.hatena.ne.jp/tanaponchikidun/20120528/1338219772
     *
     * 2012-06-07 23:42:18.898 RegexTest[1324:f803] 
     * tel:090-0000-0000
     */
}

一応これでURLと電話番号が検出できるようです。

どんどんobjectivecは便利になっていきますね。

[参考URL]

NSDataDetectorリファレンス(英語)

NSTextCheckingResultリファレンス(英語)

参考にしたstackoverflowの回答