iPhone简单电话号码验证

7

我在stackoverflow上找到了各种针对iPhone的电话号码验证,但似乎没有一个可以验证,只是改变格式。例如:电话号码格式

目标:通过警报输入该号码。北美格式,带或不带破折号。

我有一些代码,但所有内容都无效,有什么想法吗?

- (void)textFieldDidEndEditing:(UITextField *)textField {

NSString *str=@"^\\+(?:[0-9] ?){6,14}[0-9]$";
NSPredicate *no=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",str];
if([no evaluateWithObject:textField.text]==NO)
   { 

       UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Please Enter correct contact no." delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];

       [alert show];
       [alert release];

   }
   else{
NSString *textValue = textField.text;
NSLog(@"Value: %@", textValue);
   }
}

你真的不应该局限于这种类型的验证 - 只需使用免费的JSON API,如numverify.com。 - Frank
3个回答

26

编辑: 我再次阅读了问题,发现你想要验证而不是突出电话号码,所以我将NSDataDetector节移到了前面。

你可以使用NSDataDetector(这是NSRegularExpression的一个专门子类),在NSString中搜索电话号码(我相信这使用了iPhone的默认电话号码检测算法)。

NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                           error:&error];
NSUInteger numberOfMatches = [detector numberOfMatchesInString:string
                                                       options:0
                                                         range:NSMakeRange(0, [string length])];
如果你使用一个UITextView(但可能不是像你在这里使用的UITextField),你可以通过设置dataDetectorTypes属性来使用iPhone默认的电话号码检测算法来高亮显示电话号码:

Tips: dataDetectorTypes 是一个枚举类型,用于指定文本视图自动检测和加亮特定数据类型。可以指定多个类型,例如: .phoneNumber, .link, .address 等。

textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber;

请查看UIDataDetectorTypes以获取其他类型的数据探测器。


我尝试了NSDataDector,虽然我没有让它工作,但我相信这是正确的方法。当我有更多时间来尝试时,我会将其更改为这种格式。谢谢。 - Rick
1
这不是一个好的解决方案,因为如果电话号码的一部分有效,它将验证无效的电话号码。例如 - 如果整个字符串无效,但其中一部分"555-5555"是有效的电话号码,那么它将返回真值,如"(5555)555-5555"。 - Josh at The Nerdery

4
首先,真正的电话号码验证非常复杂。你是限制在NANP(北美编号计划)中,还是寻找E.164号码?看起来你试图匹配E.164,尽管这通常不是大多数人输入的号码类型。
你的匹配需要一个加号,后面跟着七到十五位数字序列,其中可以有可选的空格。这是你的意思吗?你传递了哪些字符串?
请注意,自iOS4以来,有一个叫做NSRegularExpression的东西,对此比NSPredicate更好。

好的,我添加了这个:目标:这个数字是通过警报输入的。可以带或不带破折号的北美格式。谢谢。 - Rick
3
你的正则表达式跟这个完全不同,甚至没有破折号。你为什么认为它会起作用?在 http://regexlib.com 上搜索“NANP”可以找到许多适用于此的正则表达式。所有这些表达式都有各种权衡。我建议尽可能宽容地接受任何人类提交的输入。 - Rob Napier
@"^\+?[0-9]*$" 这个可以工作。有趣的是,regexlib.com 上的第一个在 iOS 中不起作用,但在 Java Android SDK 中可以。 - Rick
谢谢你的帮助。这是一个很棒的社区。我只希望我能为它提供和我得到的一样多的帮助。 - Rick

0

使用此验证,您只能输入10个数字。您可以根据需要更改其长度。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

 BOOL valid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:_textFieldValidate.text];



       if(valid){
           if(range.length + range.location > textField.text.length)
           {
               return NO;
           }

           NSUInteger newLength = [textField.text length] + [string length] - range.length;
           return newLength <= 10;


}


return YES;

}

希望这能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接