web-dev-qa-db-fra.com

Quelles sont les meilleures pratiques pour valider les adresses électroniques dans Swift?

Je recherche la méthode la plus simple et la plus propre pour valider un courrier électronique (String) dans Swift. Dans Objective-C, j’utilisais cette méthode, mais si je la réécrivais dans Swift, l’erreur «Impossible d’analyser la chaîne de format» lors de la création du prédicat.

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}
14
animal_chin

Cela semble assez simple. Si vous rencontrez des problèmes avec votre conversion Swift, cela pourrait être utile de voir ce que vous avez réellement essayé.

Cela fonctionne pour moi:

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

validateEmail("[email protected]")     // true
validateEmail("invalid@@google.com") // false
35
Craig Otis

Version Swift 3.0

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

validateEmail("[email protected]")     // true
validateEmail("invalid@@google.com") // false
6
Jordi Bruin
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).evaluateWithObject(self)
    }
}
2
Darkngs

Je vais juste jeter mes deux sous ici et vous frapper avec une balle courbe:

Voulez-vous vraiment valider votre adresse email comme ça?

Voir ce blogpost qui suggère que tout ce que vous avez à faire pour vérifier si un email est valide est de vérifier qu'il a un symbole @ ou au plus un @ suivi à un moment donné par un .:

/.+@.+\..+/i

1
Matthew Hallatt

Voici l'extension qui fonctionne pour chaque domaine de messagerie.

Ex .: .com, .co.uk, .co.in, etc.

extension String {

     func isValidEmail() -> Bool {

         let emailRegEx = "^[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])?)*$"
         let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
         return emailTest.evaluateWithObject(self)
     }
}
1
Sohil R. Memon
      class func isValidEmail(email:String)-> Bool
      {
          let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
          var emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
          let result = emailTest!.evaluateWithObject(email)
          return result
      }
0
Himanshu Mahajan

Craigs answer fonctionne et si quelqu'un a du mal à l'implémenter, le voici avec la fonction textFieldDidEndEditing qui l'appelle. (UITextFieldDelegate nécessaire)

func textFieldDidEndEditing(textField: UITextField)
{
    if validateEmail(emailAddress.text)
    {
        println("valid")
    }
    else
    {
        println("NOT valid")
    }
}

func validateEmail(candidate: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}
0
timv

Swift 4 simplement réglé:

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

ajouter

UITextFieldDelegate

Dans viewDidLoad:

yourTextField.delegate = self

Usage:

func textFieldDidEndEditing(_ textField: UITextField) {

    guard let validEmailAddress = yourTextFiled.text else { return }
    if !(validEmailAddress.isEmail) {
        //is invalid address
    } else {
       //is valid address
  }
}
0
Fabio