1

给定一个代表 iOS 设备上的日历条目的 EKEvent,我不仅要检测电话号码,还要检测相关的电话会议访问代码。

例如,给定:

NSString *text = @"Blah Blah Blah (555) 123-4567 Access Code: 9876# Blah Blah Blah";

我想实现一个返回这个值的方法:

@"555-123-4567,,9876#"

@"Access Code: "除了描述用于访问电话会议的号码之外,日历条目还可能使用各种文本。例如,其他字符串可能包括@"passcode: ",@"virtual room number: "等。

我知道NSDataDetector检测电话号码的能力,但是鉴于上面的示例字符串,它会返回@"555-123-4567 Access Code: 9876#"(请注意,这里的“访问代码”仍然是一个子字符串)。

我正在考虑仅获取从 NSDataDetector 返回的值并对@"Access Code: "可能出现在日历条目上的类似子字符串进行字符串替换,替换为@",,",但这似乎不够优雅。我更喜欢 NSDataDetector 为我做这件事。

这是我不太满意的代码:

- (NSArray *) phonesFromText:(NSString *)text {
    NSMutableArray *phones = [NSMutableArray array];

    if (text) {
        NSError *error = nil;
        NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                                   error:&error];

        [detector enumerateMatchesInString:text
                                   options:kNilOptions
                                     range:NSMakeRange(0, [text length])
                                usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                    NSString *phoneNumberWithText = result.phoneNumber;

                                    // Replace "access code:" with ",," so that it can be dialed by the built-in phone app
                                    NSString *phoneNumberWithoutText = [phoneNumberWithText stringByReplacingOccurrencesOfString:@"access code:"
                                                                                                                      withString:@",,"
                                                                                                                         options:NSCaseInsensitiveSearch
                                                                                                                           range:NSMakeRange(0, [phoneNumberWithText length])];

                                    // Remove any unwanted characters that may still be lingering after the above string replacement
                                    NSCharacterSet * toRemove = [[NSCharacterSet characterSetWithCharactersInString:@"+,#-0123456789"] invertedSet];
                                    phoneNumberWithoutText = [[phoneNumberWithoutText componentsSeparatedByCharactersInSet:toRemove] componentsJoinedByString:@""];                                        

                                    [phones addObject:phoneNumberWithoutText];
                                }];

    }

    return phones;
}

问题:除了我上面提出的字符串替换解决方案之外,还有更好的方法吗?

4

0 回答 0