【问题标题】:TextField either phone number or Email format validation swift?TextField 电话号码或电子邮件格式验证迅速吗?
【发布时间】:2021-02-21 00:02:36
【问题描述】:

我有一个忘记密码的文本字段,在这里用户输入手机号码或电子邮件,然后我们发送 OTP。

我正在尝试使用我的代码验证该文本字段,但它不起作用,任何人对此有一些想法,请通过以下方式找到我的代码。

它需要对 mailid 或电话号码格式有效。

if emaiTF.text == "" {
            print("Enter either valid phone or email")
        }else if let validphone = emaiTF.text, validphone.isValidPhone() || validphone.isValidEmail() {
            print("Enter either valid phone or email")
        }else{
            forGotPasswordApi()
        }

我的验证方法如下。

extension String {
    func isValidEmail() -> Bool {
        // here, `try!` will always succeed because the pattern is valid
        let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
        return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
    }

    // vrify Valid PhoneNumber or Not
    func isValidPhone() -> Bool {

        let phoneRegex = "^[0-9]{10}$";
        let valid = NSPredicate(format: "SELF MATCHES %@", phoneRegex).evaluate(with: phoneRegex)
        return valid
    }
}

【问题讨论】:

  • 我已在下面的答案中修改并添加了您的代码补丁。请检查,如果它对您有用,请接受,以便其他人可以从中受益!!

标签: ios swift validation


【解决方案1】:

这似乎是您的输出验证中的问题。修改了你的代码以如下方式工作,请验证。

  extension ViewController {

    func checkValidation() {
      if txtUserName.text == "" {
          print("Enter either valid phone or email 1")
      } else if let validphone = txtUserName.text, validphone.isValidPhone() || validphone.isValidEmail() {
          print("Success")
          forGotPasswordApi()
      }else{
        print("Enter either valid phone or email 2")
      }
    }
  }

  extension String {
      func isValidEmail() -> Bool {
          // here, `try!` will always succeed because the pattern is valid
          let regex = try! NSRegularExpression(pattern: "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,3})$", options: .caseInsensitive)
        let valid = regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
        print("Email validation \(valid)")
          return valid
      }

      // vrify Valid PhoneNumber or Not
      func isValidPhone() -> Bool {

        let regex = try! NSRegularExpression(pattern: "^[0-9]\\d{9}$", options: .caseInsensitive)
        let valid = regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
        print("Mobile validation \(valid)")
          return valid
      }
  }

【讨论】:

    【解决方案2】:

    我的验证是:

    extension String {
    
    var isValidEmail: Bool {
        return NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,3}").evaluate(with: self)
    }
     var numberValidation: Bool {
        return NSPredicate(format: "SELF MATCHES %@", "^(?=.*[0-9]).{10}$").evaluate(with: self)
      }
    }
    

    我用于检查输入的代码

    if mailTextField.text!.isValidEmail {
            print("u have entered correct mail format")
        }
    if phonenumber.text!.numberValidation {
     print("mobile number in correct format")
    }
    

    【讨论】:

    • 你甚至没有检查字符串是否是一个有效的电话号码
    • 我没有让你明白。如果你不是这个意思,你能再清楚一次(作为新贡献者)吗?
    • 如果您没有得到答案,为什么还要编辑您的答案并添加电话号码条件?顺便说一句,我已经对其他帖子发表了评论。 UITextField 文本属性永远不会返回 nil。它的默认值是一个空字符串。你可以简单地强制解开它的结果if mailTextField.text!.isValidEmail {
    • 当然,感谢您对我的评论的价值贡献。
    • == true 是多余的,如果你的字符串不再是可选的,你可以简单地省略它
    【解决方案3】:

    电话号码验证

     func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        let aSet = NSCharacterSet(charactersIn:"0123456789").inverted
    
        let compSepByCharInSet = string.components(separatedBy: aSet)
    
        let numberFiltered = compSepByCharInSet.joined(separator: "")
    
        guard let text = textField.text else { return true }
    
        let count = text.count + string.count - range.length
    
        return string == numberFiltered && count <= 10
    
      }
    

    【讨论】:

    • OP 对电话号码或电子邮件使用相同的字段。您不能简单地从 Textfield 内容中丢弃任何非数字。顺便说一句,您为什么不简单地过滤掉不需要的字符? string.filter { "0"..."9" ~= $0 } 另一点是joined(separator: "") 没有意义,只需使用joined()
    • UITextField 文本属性永远不会返回 nil。它的默认值是一个空字符串。你的守卫永远不会进入封闭区。
    【解决方案4】:

    我通过更改验证检查稍微更新了您提供的代码。我认为 validInput.isValidPhone() || validInput.isValidEmail() 没有在您的代码上正确处理。

    // Check if any input is entered and not empty string
    guard let validInput = emaiTF.text, validInput != "" else {
      print("Enter either valid phone or email")
      return
    }
    
    // Check if entered value is valid or not
    if validInput.isValidPhone() || validInput.isValidEmail() { 
      forGotPasswordApi()
    } else {
      print("Enter either valid phone or email")
    }
    

    【讨论】:

    • UITextField 文本属性永远不会返回 nil。它的默认值是一个空字符串。顺便说一句,您可以简单地使用名为hasTextUIKeyInput 属性来检查该字段是否为空
    • @LeoDabus 我只是想添加与提出问题的人相同的检查。
    • guard emaiTF.hasText else {if emaiTF.text!.isValidPhone() || emaiTF.text!.isValidEmail() {
    【解决方案5】:

    电子邮件验证

    在下面的方法中传递你的字符串

    以下方法将返回布尔值 YES 或 NO

    方法:

     func isValidEmail(testStr:String) -> Bool {
        // print("validate calendar: \(testStr)")
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    
        let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: testStr)
    }
    

    用法:

    if isValidEmail(testStr: emailTxtFld.text!) == True {
    
           print("Valid");        
     }
    else {
    
        print("In Valid");
     }
    

    【讨论】:

    • isValidEmail 方法采用非可选字符串。调用该方法emailTxtFld.text 时,您需要解开字符串。 BTW == true 是多余的。 if isValidEmail(testStr: emailTxtFld.text!) {
    • 添加2个答案的原因是什么?您可以更新之前添加的答案。
    • True 这不是一个类型。再次== true 是多余的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多