Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IPhone简单电话号码验证_Iphone_Objective C_Ios_Validation - Fatal编程技术网

IPhone简单电话号码验证

IPhone简单电话号码验证,iphone,objective-c,ios,validation,Iphone,Objective C,Ios,Validation,我在stackoverflow上找到了各种各样的iphone手机号码验证,但似乎没有一个验证它们只是改变了格式。例如 目标:通过警报输入此号码。北美有或没有破折号 所以有一些代码,但每件事都是无效的任何想法 - (void)textFieldDidEndEditing:(UITextField *)textField { NSString *str=@"^\\+(?:[0-9] ?){6,14}[0-9]$"; NSPredicate *no=[NSPredicate predicateWit

我在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);
   }
}

首先,真实电话号码验证相当复杂。您是将自己局限于NANP(北美编号计划),还是在寻找E.164编号?看起来你正在努力匹配E.164,尽管这通常不是大多数人会输入的数字

您的匹配需要一个加号,后跟一个长度在7到15之间的数字序列,中间有可选的空格。这就是你的意思吗?你在传递什么信息


请注意,在iOS4中,有一个
NSRegularExpression
NSPredicate

编辑更好:我再次阅读了这个问题,发现您想要验证,而不是突出显示电话号码,因此我将
NSDataDetector
部分上移

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

如果您使用
UITextView
(但可能不是像这里使用的
UITextField
),您可以通过设置其
dataDetectorTypes
属性,使用iPhone的默认电话号码检测算法突出显示电话号码:

textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber;

有关其他类型的数据检测器,请参见
UIDataDetectorTypes

使用此验证,您只能输入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;

}
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串{
BOOL valid=[[NSPredicate predicateWithFormat:@“SELF MATCHES%@”,REGEX_FOR_INTEGERS]evaluateWithObject:_textFieldValidate.text];
如果(有效){
if(range.length+range.location>textField.text.length)
{
返回否;
}
NSUInteger newLength=[textField.text length]+[string length]-range.length;

return newLength确定我添加了以下内容:目标:此数字是通过警报输入的。北美有破折号或没有破折号。谢谢您您的正则表达式与此完全不同。它甚至没有破折号。为什么您认为它会起作用?搜索“NANP”为了找到大量的正则表达式。所有正则表达式都有各种各样的折衷。我建议尽可能地原谅人类交给你的任何东西。@“^\\+?[0-9]*$”这一个有效。有趣的是,regexlib.com上的第一个在iOS中没有,但在java android sdk中有。谢谢你的帮助。这是一个很棒的社区。我只希望我能尽可能多地提供帮助。我尝试了NSDataDector,虽然我没有让它工作,但我相信这将是一种方式。当我有更多的时间玩它时,我会使用它将其更改为此格式。谢谢这不是一个好的解决方案,因为如果电话号码的一部分有效,它将验证无效的电话号码。例如-这将为“(5555)555-5555”返回true,因为“555-5555”是一个有效的电话号码,即使整个字符串不是。您真的不应该将自己限制为这种类型的验证-只需使用免费的JSON API,如numverify.com
- (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;

}