【问题标题】:Validation of email in swift iOS application在 swift iOS 应用程序中验证电子邮件
【发布时间】:2015-06-22 09:38:03
【问题描述】:
class func isValidEmail(testStr:String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
    let result = range != nil ? true : false
    return result
}

我使用此功能验证登录表单中的电子邮件。我无法理解如何从我的文本字段中引发此事件。

这样使用

if(username.isEqualToString("") || [!LoginController, testStr == self.username]) {
    self.dismissViewControllerAnimated(true, completion: nil)
    var alertView:UIAlertView = UIAlertView()
    alertView.title = "Sign in Failed!"
    alertView.message = "Please enter valid username"
    alertView.delegate = self
    alertView.addButtonWithTitle("OK")
    alertView.show()
    return
}

但在teststr 出现未解决的错误。我是斯威夫特的新手。任何人都可以解释我如何解决这个问题吗?

【问题讨论】:

    标签: ios xcode swift


    【解决方案1】:

    它已经写在很多很多其他类似的线程中,但由于它不在这个,我将是一个明智地说出真相的人:

    不要费心用过于复杂(错误)的正则表达式来验证邮件

    因为即使您的正则表达式是完美的并且过滤所有可能的电子邮件地址而没有误报(这会打扰您的用户),您的正则表达式也不会阻止任何用户拼写错误。

    确保电子邮件地址有效的唯一方法是向其发送带有代码或验证机制的邮件。所以,我建议你只用.+@.+之类的东西检查你的邮件地址,因为所有的电子邮件地址总是有这个表格。

    然后,向它发送邮件以确保:

    1. 电子邮件地址存在
    2. 电子邮件地址有效
    3. 用户是电子邮件地址的所有者(或者,至少,此时可以访问它)

    由于电子邮件地址不仅仅是语法问题,如果您必须使用有效地址,请确保它们不是语法正确。

    【讨论】:

      【解决方案2】:

      这适用于 swift 4、5

      扩展字符串{

      var isValidEmail: Bool {
          let regex =  "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
          let namePredicate = NSPredicate(format: "SELF MATCHES%@", regex)
          return namePredicate.evaluate(with: self)
      }
      

      }

      【讨论】:

        【解决方案3】:

        Apple Swift 5.1.3 版和 Xcode 11.4

        extension String {
            func isEmail()->Bool {
                    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
                    return  NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
            }
        }
        

        使用它:

         if let _textfieldText = textField.text {
                    if _textfieldText.isEmail() {
                        print("Okay Email go ahead")
                    }else{
                        print("Enter a valid email address first.")
                    }
                }
        

        【讨论】:

          【解决方案4】:

          Swift 4.2 和 Xcode 10

          对我来说,如果域名后有两个以上的点,其他答案将返回 true。我在正确处理该条件的地方找到了这个答案。

          func isValidEmail(testStr:String) -> Bool {
              let emailRegEx = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{1,4}$"
              let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
              return emailTest.evaluate(with: testStr)
          }
          

          快乐编码?

          【讨论】:

          • 不为某人工作123@tc.columbia.edu
          【解决方案5】:

          您可以使用简单的正则表达式函数验证电子邮件,如果有效则返回true,否则返回false

          您可以在用户在键盘事件(例如editingDidEnd)上点击Done/Enter 时验证它。您可以将它从情节提要绑定到类文件,例如,

          @IBAction func onPressDone(sender: UITextField){
              if txtEmaildAddress.text.isEmpty {
                  println("enter email address") //prompt ALert or toast
              }
              else if self.validate(txtEmaildAddress.text) {
                  println("Invalid email address") // prompt alert for invalid email
              }
          }
          
          func validate(YourEMailAddress: String) -> Bool {
              let REGEX: String
              REGEX = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
              return NSPredicate(format: "SELF MATCHES %@", REGEX).evaluateWithObject(YourEMailAddress)
          }
          

          可能有助于此方法轻松验证。

          HTH,享受编码!

          【讨论】:

          • 为什么是REGEX?为什么要打破所有可能的变量命名约定? YourEmailAddress? txtEmaildAddress?为什么不坚持一个约定?
          【解决方案6】:
          func isValidEmail(_ email: String) -> Bool {
              let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}" +
                               "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
                               "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" +
                               "z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" +
                               "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
                               "9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
                               "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"     
              let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
              return emailTest.evaluate(with: email)
          }
          

          用法:

          isValidEmail("name@mail.com")
          output -> true

          isValidEmail("name@mail")
          output -> false

          【讨论】:

          • 多么可怕的正则表达式 oO 它让我瞬间头疼。
          【解决方案7】:

          斯威夫特

          extension String {
              let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
              let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailFormat)
              return emailPredicate.evaluate(with: self)
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-20
            • 1970-01-01
            • 2016-10-23
            • 2018-12-25
            • 2012-01-20
            • 1970-01-01
            • 2015-03-15
            相关资源
            最近更新 更多