在 swift iOS 应用程序中验证电子邮件

Posted

技术标签:

【中文标题】在 swift iOS 应用程序中验证电子邮件【英文标题】:Validation of email in swift iOS application 【发布时间】: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 出现未解决的错误。我是斯威夫特的新手。任何人都可以解释我如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

【参考方案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)

【讨论】:

以上是关于在 swift iOS 应用程序中验证电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

iOS如何从解析Swift 4中获取值“布尔”

iOS Swift:在收件箱电子邮件中打开邮件应用程序

iOS / Swift:在 UITextFields 的键盘上显示电子邮件地址建议

如何在 swift iOS 应用程序中调用分支初始化

如何在 swift 5 中使用 alamofire 对登录到我的 iOS 应用程序的用户进行身份验证?

如何通过 iOS(swift)将 Firebase Auth 与 MySQL DB 同步?