2011-08-24 346 views
6

我发现iphone上的stackoverflow的各种电话号码验证,但似乎没有任何验证,他们似乎只是改变格式。示例Phone number formattingiPhone的简单电话号码验证

目标:通过警报输入此号码。北美有或没有破折号。

所以有一些代码,但是每件事情都会像任何想法一样无效。

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

NSString *[email protected]"^\\+(?:[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); 
    } 
} 
+0

你真的不应该限制自己这种类型的验证 - 只需使用像numverify.com这样的免费JSON API – Frank

回答

3

首先,真正的电话号码验证相当复杂。您是否仅限于NANP(北美编号计划),还是您在寻找E.164号码?它看起来像你试图主要匹配E.164,但这通常不是大多数人会输入的数字。

您的匹配需要一个加号,然后是一个7到15之间的数字序列,并在它们之间有可选空格。你是这个意思吗?你传递了什么字符串?

请注意,从iOS4开始,有NSRegularExpression这比NSPredicate要好一些。

+0

好的,我添加了这个:目标:这个数字是通过警报输入的。北美有或没有破折号。谢谢 – Rick

+3

你的正则表达式看起来不像这样。它甚至没有破折号。你为什么相信它会起作用?搜索http://regexlib.com“NANP”找到这个很多正则表达式。所有的都有各种权衡。我建议尽可能宽容任何人类的手。 –

+0

@“^ \\ +?[0-9] * $”这个可以工作。有趣的在regexlib.com上的第一个不在iOS中,但在java android sdk中。 – Rick

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的默认电话号码检测算法的电话号码:

textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber; 

查看UIDataDetectorTypes其他类型的数据检测器。

+0

我试过NSDataDector,虽然我没有得到它的工作,我相信这将是一条路。当我有更多时间玩它时,我会将其更改为这种格式。谢谢 – Rick

+0

NSDataDetector是如何失效的? –

+0

嘿,为你做这个工作? –

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; 

} 

希望这会对你有帮助。