【问题标题】:Validate phone number ios验证电话号码 ios
【发布时间】:2012-10-21 23:33:51
【问题描述】:

我需要验证国际电话号码。

我知道验证国际电话号码很困难,所以我会保持简单:

+ 或 00 然后 6-14 个数字

由于某种我无法解决的原因,我当前使用正则表达式的代码无法正常工作。它只是说它无法打开正则表达式并崩溃。

这是我当前的代码:

NSString *phoneRegex = @"^[\+(00)][0-9]{6,14}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];

BOOL phoneValidates = [phoneTest evaluateWithObject:phoneNumber];

我哪里错了?

谢谢!

【问题讨论】:

标签: iphone ios regex ipad


【解决方案1】:

这取决于你想要的严格程度,这个正则表达式似乎不是特别严格。这个正则表达式说:

从行首开始 匹配一个 + (或者可能是 1 或 0),这看起来模棱两可(但可能不取决于实现),因为捕获括号:() 打破了 + 和 ? 可能放错地方: 匹配任何数字 0-9 1 或 0 次 6-14 次 然后一位数字 0-9 然后结束。 您还注意到,任何反斜杠都必须加倍...... @"\b" 用于单词边界。您可能想尝试类似...

@"\\b[\\d]{3}\\-[\\d]{3}\\-[\\d]{4}\\b"
would I think match your example, but it wouldn't match
(555) 555 - 5555 or
555.555.5555 or
+44 1865  55555

【讨论】:

  • 不确定我是否理解。你有没有抄袭别人的答案
  • @vikramjain 如果电话号码有字母,那么我们如何解析它?像苹果公司的电话号码是 1800MYAPPLE。有任何正则表达式吗?
【解决方案2】:
NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$";

这种方式好一点。如果您转义“\”,您的代码也可以正常工作。

【讨论】:

  • \正在转义+...我还需要转义+吗?
  • 您需要先转义斜线才能在字符串中“输入”。 \\ 将导致 \ 用于正则表达式。
  • 但这仅适用于遵循国际电联建议的国家。日本、统一地位和其他一些国家使用不同的前缀。我认为您的代码不适合这些国家/地区是否正确?如果是这样,也许修改您的代码以接受各种前缀,而不仅仅是 00? en.wikipedia.org/wiki/List_of_international_call_prefixes
  • 这里为什么需要括号,用@"^(\\+|00)[0-9]{6,14}$";岂不是一样好?
【解决方案3】:

txtlpmobile.text 是字符串(手机不输入)

 int length = [self getLength:txtLpMobile.text];
            if(length == 10) {
                if(range.length == 0)
                    return NO;
            }
            if(length == 3){
                NSString *num = [self formatNumber:txtLpMobile.text];
                txtLpMobile.text = [NSString stringWithFormat:@"(%@) ",num];

                if(range.length > 0) {
                    txtLpMobile.text = [NSString stringWithFormat:@"%@",[num substringToIndex:3]];

                }
            } else if(length == 6) {
                NSString *num = [self formatNumber:txtLpMobile.text];
                txtLpMobile.text = [NSString stringWithFormat:@"(%@) %@-",[num  substringToIndex:3],[num substringFromIndex:3]];
                if(range.length > 0) {
                    txtLpMobile.text = [NSString stringWithFormat:@"(%@) %@",[num substringToIndex:3],[num substringFromIndex:3]];
                }
            }

            NSUInteger newLength;
            newLength = [txtLpMobile.text length] + [string length] - range.length;
            NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
            NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
            return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));

用于格式化数字

-(NSString*)formatNumber:(NSString*)mobileNumber
{
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];

    int length = [mobileNumber length];
    if(length > 10)
    {
        mobileNumber = [mobileNumber substringFromIndex: length-10];
    }
    return mobileNumber;
}

获取长度

-(int)getLength:(NSString*)mobileNumber
{
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
    mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];

    int length = [mobileNumber length];

    return length;
}

【讨论】:

  • 不支持国际电话号码。
【解决方案4】:

复制粘贴方法来验证电话号码:

- (BOOL)validatePhone:(NSString *)phoneNumber
{
    NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$";
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];

    return [phoneTest evaluateWithObject:phoneNumber];
}

开源用于验证电话号码的库

https://github.com/iziz/libPhoneNumber-iOS

【讨论】:

  • 是否可以使用这样的电话验证库:link?非常齐全,提供很多服务。
  • 火箭,,宾果谢谢 :)
【解决方案5】:
-(int)findLength:(NSString*)phoneNumber
{
    phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
    phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
    phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
    phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
    phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];

int length = [phoneNumber length];

return length;

}

【讨论】:

  • 欢迎来到 Stack Overflow!这个问题的答案已经提供并被接受(4 年前)!你的回答有没有带来新的东西?如果是这样,你应该解释原因。
【解决方案6】:

验证电话号码的唯一好方法是使用Google's amazing LibPhoneNumber。有一个 iOS 端口,或者您可以在隐藏的 UIWebView 中运行 JavaScript 实现。

(我在几年前完成了后者,当时他们还没有 iOS 端口。就像一个魅力,即使在旧 iPhone 上也非常快。)

【讨论】:

  • 我认为这是一个很好的建议,但这个问题专门针对如何让一段代码工作。我已经在我们有狭窄要求的特定验证位上工作过,而且库是矫枉过正的。
  • @benc 由于电话号码的复杂性,“一段代码”总是会失败。除了使用库之外别无他法。快速浏览一下主资源文件 LibPhoneNumber 应该会立即让您信服。
  • 我已经测试了多个电话号码处理程序,我不需要太多说服力。但有时,即使它是最好的解决方案,提出问题的人也无法使用它。
  • @benc 这不是好和更好的问题,而是正确和正确的问题。当然有人问可以随意使用不正确的电话号码格式并惹恼用户。
【解决方案7】:

验证电话号码和密码限制的简单方法,只需按照以下过程。

if ((self.mobileTxtFld.text.length < 10 )) {
    [_mobileTxtFld becomeFirstResponder];
}
else if ((self.passwordTxtFld.text.length < kPasswordCharacterMinLimit) || (self.passwordTxtFld.text.length > kPasswordCharacterMaxLimit)) {
    // show alert
}

之后,您可以在其中实现文本文件委托方法“shouldChangeCharactersInRange”,只需编写此代码

if (textField == _mobileTxtFld) {
    if([string rangeOfCharacterFromSet:ALLOWED_NUMBERS].location == NSNotFound){
        NSUInteger newLength = [textField.text length] + [string length] - range.length;
        if(newLength > kMobileNumberLimit - 1){
            if(textField.text.length != kMobileNumberLimit){
                textField.text  = [NSString stringWithFormat:@"%@%@",textField.text,string];
            }
            [textField resignFirstResponder];
            return NO;
        }
        else{
            return YES;
        }
    }
    else{
        return NO;
    }
}

return YES;

这里是 ALLOWED_NUMBERS 和 kMobileNumberLimit

#define kMobileNumberLimit 10
#define ALLOWED_NUMBERS [[NSCharacterSet decimalDigitCharacterSet] invertedSet]
#define minLimit 6
#define maxLimit 17

【讨论】:

    【解决方案8】:

    在 Swift 4 -

    func ValidateMobileNumber(txtFeid : UITextField, strChk : String, range: NSRange) -> Bool {
    
        if txtFeid.text!.count >= 10 {
            return false
        } 
    
        let formatePre = "^((\\+)|(00))[0-9]{6,14}$"
        let resultPredicate : NSPredicate = NSPredicate(format: "SELF MATCHES %@",formatePre)
        return resultPredicate.evaluate(with: strChk)
    }
    

    【讨论】:

      【解决方案9】:

      NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}|[0-9]{6,14}$";

      这是经过测试的正则表达式 这将接受有国家代码或没有国家代码

      【讨论】:

      • 当心。这会在 iOS 15 中崩溃。
      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多