项目中有要输入电话的地方,要求提交的时候进行校验为手机号码。
其实就是特殊处理一下通讯录中带来的带有+86的电话(类似+86 185 xxxx xxxx),然后进行正则匹配。直接上代码。
NSString *telNumber = self.visitorDetailModel.Customer_Tel;
//去除号码中的空格
telNumber = [telNumberstringByReplacingOccurrencesOfString:@" " withString:@""];
if([telNumberhasPrefix:@"+86"]) {//如果号码中带有+86,去除+86
telNumber = [telNumbersubstringFromIndex:3];
}
if (![GMUtilityTool isMobileNumber:telNumber]){//正则匹配是否为正确的手机号码
UIAlertController *vc = [UIAlertController alertControllerWithTitle:@"提示" message:@"请输入正确的手机号码" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[vc addAction:action];
[self presentViewController:vc animated:YES completion:nil];
}
//判断是否为正确的手机号码的正则
+ (BOOL)isMobileNumber:(NSString*)mobileNum
{
NSString *phoneRegex = @"^1[3456789]\\d{9}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
return [phoneTestevaluateWithObject:mobileNum];
}
OK,基本上面这样就完事了。但是最近有用户在用的时候反馈输了正确的11位号码,还是不通过,依旧提示请输入正确的手机号码,并且测试也没测出来。
测试认为有空格存在,我说我处理了空格,不可能有问题的,反复复制粘贴过来带空格的号码试验,依旧没事。
最后反复试了所有的可能之后,发现从系统通讯录带过来的带有+86的号码(类似+86 185 xxxx xxxx)的不能通过,所以我怀疑这里面的空格并不是我们平时手动输入的空格。
用打印地址的方式进行了验证
我们可以看到后面两个手输的空格地址一样,但是第一个从电话里粘贴过来的“空格”地址却不一样。这货是一个长的跟空格一样的其他字符。
。。。。。。
没办法在代码处多加了一行
//去除手动输入的空格
telNumber = [telNumberstringByReplacingOccurrencesOfString:@" " withString:@""];
//去除通讯录带来的坑逼"空格"
telNumber = [telNumberstringByReplacingOccurrencesOfString:@" " withString:@""];