【问题标题】:NSDataDetector detecting "phone number" textNSDataDetector 检测“电话号码”文本
【发布时间】:2013-12-09 09:16:07
【问题描述】:

我可以解释这个问题的最简单方法是使用代码示例及其输出,但本质上,NSDataDetector 正在检测包含“电话号码”字样的字符串中的电话号码。

NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                               error:&error];

NSArray *stringsToTest = @[
                           @"testing phone number 0123 4567891",
                           @"testing some other number 0123 4567892",
                           @"phone number 0123 4567893",
                           @"blah blah 0123 4567894",
                           @"testing telephone number 0123 4567895"
                           ];

for (NSString *string in stringsToTest)
{
    [dataDetector enumerateMatchesInString:string
                                   options:0
                                     range:NSMakeRange(0, string.length)
                                usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                    NSLog(@"%@", result.phoneNumber);
                                }];
}

输出:

2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567891
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567892
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567893
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567894
2013-11-24 19:04:26.001 PhoneNumberDetector[21874:70b] 0123 4567895

我已经阅读了文档并搜索了 SO,但找不到任何表明这是否是预期行为以及如果是,为什么。

这发生在 7.0 模拟器以及运行 7.0.4 的 iPhone 5s 上。

如果有人能阐明这个问题,我将不胜感激。

更新: 澄清一下,在访问 NSTextCheckingResult phoneNumber 属性时,我不希望文本“电话号码”成为结果的一部分。

【问题讨论】:

  • 那是这些输入的实际日志吗?您能否更改源编号,以便准确查看匹配的结果。我不知道有任何文档涵盖此问题,问题是您想如何处理它。
  • 是的,输出是正确的,我已经编辑了数字以帮助显示匹配项 (1,2,3,4,5)。
  • 这是ios 7的奇怪行为,你必须在苹果网站上报告。
  • 在 bugreport.apple.com 和 Open Radar openradar.appspot.com/15561004 提交的错误报告
  • 我不确定这是一个错误还是故意的,但我有一个相关的问题,其当前解决方案取决于此行为,所以如果它是一个错误,我会有点难过得到修复:stackoverflow.com/questions/24880007/…

标签: objective-c nsdatadetector datadetectortypes


【解决方案1】:

虽然这似乎是 Apple 代码中的一个错误,但如果您想通过消除块中的非数字字符来仅从字符串中提取数字,则有一个简单的解决方法:

NSError *error = nil;
    NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                                   error:&error];

    NSArray *stringsToTest = @[
                                @"testing phone number 0123 4567891",
                                @"testing some other number 0123 4567892",
                                @"phone number 0123 4567893",
                                @"blah blah 0123 4567894",
                                @"testing telephone number 0123 4567895",
                                @"phone",
                                @"number",
                                @"my phone number 1234587985",
                                @"this string does not contain a phone number"
                               ];

    for (NSString *string in stringsToTest)
    {
        [dataDetector enumerateMatchesInString:string
                                       options:0
                                         range:NSMakeRange(0, string.length)
                                    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
                                    {
                                        NSString *numberWithExtra = result.phoneNumber;
                                        NSCharacterSet *toRemove = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
                                        NSString *trimmed = [[numberWithExtra componentsSeparatedByCharactersInSet:toRemove] componentsJoinedByString:@""];
                                        if(trimmed && trimmed.length)
                                        {
                                            NSLog(@"%@", trimmed);
                                        }
                                        else
                                        {
                                            NSLog(@"No phone number");
                                        }
                                    }];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多