IPhone简单电话号码验证
我在stackoverflow上找到了各种各样的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
- (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;
}