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];
}
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
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
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)
}
}
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
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)
}
}
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
}
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)
}
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
}
}