Comment valider une adresse e-mail dans swift?

est-ce que quelqu'un sait valider une adresse e-mail dans Swift? J'ai trouvé ce code:

- (BOOL) validEmail:(NSString*) emailString {

    if([emailString length]==0){
        return NO;
    }

    NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}";

    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];

    NSLog(@"%i", regExMatches);
    if (regExMatches == 0) {
        return NO;
    } else {
        return YES;
    }
}

mais je ne peux pas le traduire en Swift.

236
demandé sur Bartłomiej Semańczyk 2014-08-24 15:15:58

30 réponses

j'utiliserais NSPredicate :

 func isValidEmail(testStr:String) -> Bool {        
    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)
}

pour les versions de Swift antérieures à 3.0:

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

pour les versions de Swift antérieures à 1.2:

 class func isValidEmail(testStr:String) -> Bool {
    println("validate calendar: \(testStr)")
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"

    if let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
        return emailTest.evaluateWithObject(testStr)
    }
    return false
}
590
répondu Maxim Shoustin 2018-01-11 22:48:46

comme String extension de classe

SWIFT 4

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
    }
}

Utilisation

if "rdfsdsfsdfsd".isValidEmail() {

}
89
répondu Arsonik 2018-04-09 09:40:30

édition, mise à jour pour Swift 3:

func validateEmail(enteredEmail:String) -> Bool {

    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: enteredEmail)

}

réponse originale pour Swift 2:

func validateEmail(enteredEmail:String) -> Bool {

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

}

ça marche très bien.

88
répondu Azik Abdullah 2017-02-17 12:23:07

si vous cherchez une solution propre et simple pour faire cela, vous devriez jeter un oeil à https://github.com/nsagora/validation-components .

il contient un prédicat de validation d'email qui est facile à intégrer dans votre code:

let email = "test@example.com"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)

derrière la hotte il utilise le RFC 5322 reg ex ( http://emailregex.com ):

let regex = "(?:[\p{L}0-9!#$%\&'*+/=?\^_`{|}~-]+(?:\.[\p{L}0-9!#$%\&'*+/=?\^_`{|}" +
    "~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\" +
    "x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[\p{L}0-9](?:[a-" +
    "z0-9-]*[\p{L}0-9])?\.)+[\p{L}0-9](?:[\p{L}0-9-]*[\p{L}0-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]?|[\p{L}0-9-]*[\p{L}0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21" +
    "-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
29
répondu alexcristea 2016-09-17 19:11:20

voici un fusible des deux réponses les plus votées avec le regex correct: une extension de chaîne en utilisant predicate afin que vous puissiez appeler string.isEmail

    extension String {
        var isEmail: Bool {
           let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,20}"            
           let emailTest  = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
           return emailTest.evaluateWithObject(self)
        }
    }
21
répondu Nicolas Manzini 2016-03-03 23:43:20

Ceci est la version mise à jour pour Swift 2.0-2.2

 var isEmail: Bool {
    do {
        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.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
    } catch {
        return false
    }
}
15
répondu Joel García Verástica 2016-07-07 10:08:33

je suggère de l'utiliser comme extension de chaîne:

extension String {    
    public var isEmail: Bool {
        let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)

        let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length))

        return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
    }

    public var length: Int {
        return self.characters.count
    }
}

et à son utilisation:

if "hodor@gameofthrones.com".isEmail { // true
    print("Hold the Door")
}
13
répondu JeffersonBe 2018-07-10 11:26:52

Voici la solution raisonnable:

"THE REASONABLE SOLUTION "

"

utilisé et testé pendant des années dans beaucoup, beaucoup d'applications de volume énorme.

1-il évite les nombreuses très erreurs regex vous voyez souvent dans ces suggestions

2 - n'est pas permettre stupide e-mails tels que "x@x", qui sont techniquement valable, mais qui sont complètement stupides et votre personnel de soutien, etc, serait instantanément rejeter de toute façon. Si vous avez besoin d' (dans quel but?) une solution qui permet des e-mails stupides, utiliser une autre solution.

3 - il est extrêmement compréhensible , autant que peut être espéré

4 - C'est BAISER, fiable, et testé à la destruction commerciale des applications avec un nombre énorme d'utilisateurs de

let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\.){1,5}"
let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,8}"
let __emailPredicate = NSPredicate(format: "SELF MATCHES %@", __emailRegex)

extension String {
    func isEmail() -> Bool {
        return __emailPredicate.evaluate(with: self)
    }
}

extension UITextField {
    func isEmail() -> Bool {
        return self.text.isEmail
    }
}

explication:

dans la description suivante," OC " signifie caractère ordinaire: so, une lettre ou un chiffre.

_ _ première partie ... doit commencer et finir avec un OC. Pour les caractères du milieu, vous pouvez avoir quelques caractères inhabituels tels que underscore, mais le début et la fin doivent être OC. (C'est normal de n'avoir qu'un seul OCAN c'est ça, exemple j@blah.com)

_ _ serverpart ... Vous avez des sections comme " bla."qui répètent. (Donc, mail.city.fcu.edu genre de chose.) Les sections doivent commencer et finir avec un OC, mais au milieu vous pouvez aussi avoir dash "-". (Si vous voulez permettre d'autres caractères inhabituels là-dedans, dites "underscore", il suffit de l'ajouter avant le tiret.) C'est normal d'avoir une section qui n'est qu'une OC. (Comme dans joe@x.com ou joe@w.campus.edu) vous pouvez avoir jusqu'à cinq sections; vous devez en avoir une. Enfin le TLD (.com ou similaire) est strictement de 2 à 8 lettres.

notez que vous gardez simplement le prédicat comme un mondial (trivial dans Swift), pas besoin de le construire à chaque fois. C'est la première chose Qu'Apple mentionne à propos de la question dans le doco.

12
répondu Fattie 2018-06-26 15:01:47

Voici une méthode basée sur rangeOfString :

class func isValidEmail(testStr:String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"
    let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
    let result = range != nil ? true : false
    return result
}

Remarque: mise à jour de TLD longueur.

voici le RegEx définitif pour le courrier électronique selon la RFC 5322, notez qu'il est préférable de ne pas utiliser cela parce qu'il ne vérifie que la syntaxe de base des adresses e-mail et ne vérifie pas si le domaine de premier niveau existe.

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-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])+)
     \])

voir Regular-Expressions.info pour plus d'informations sur les e-mails regex.

notez qu'aucune échappatoire n'est requise par un langage tel que Objectif-C ou Swift.

7
répondu zaph 2015-06-15 14:52:23

je préfère utiliser une extension pour ça. En outre, cette url http://emailregex.com peut vous aider à tester si regex est correcte. En fait, le site propose différentes implémentations pour certains langages de programmation. Je partage mon implémentation pour Swift 3 .

extension String {
    func validateEmail() -> 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)
    }
}
7
répondu Marlon Ruiz 2016-10-26 16:08:48

il y a beaucoup de bonnes réponses ici, mais beaucoup de" regex "sont incomplets et il peut arriver qu'un email comme:" nom@domaine " résulte un email VALIDE, mais ce n'est pas le cas. Voici la solution complète:

extension String {

    var isEmailValid: Bool {
        do {
            let regex = try NSRegularExpression(pattern: "(?:[a-z0-9!#$%\&'*+/=?\^_`{|}~-]+(?:\.[a-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])+)\])", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
            return false
        }
    }
}
6
répondu Andrea.Ferrando 2016-02-26 12:23:08

pour swift 2.1: cela fonctionne correctement avec l'email foo@bar

extension String {
    func isValidEmail() -> Bool {
        do {
            let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
                return false
        }
    }
}
5
répondu lee5783 2016-01-30 02:59:09

j'ai fait une bibliothèque conçue pour les validations d'entrée et l'un des "modules" vous permet de valider un tas de trucs...

par exemple pour valider un email:

let emailTrial = Trial.Email
let trial = emailTrial.trial()

if(trial(evidence: "test@test.com")) {
   //email is valid
}

SwiftCop est la bibliothèque... espérons que cela aide!

2
répondu Andres 2015-11-05 12:44:18

créer une extension simple:

extension NSRegularExpression {

    convenience init(pattern: String) {
        try! self.init(pattern: pattern, options: [])
    }
}

extension String {

    var isValidEmail: Bool {
        return isMatching(expression: NSRegularExpression(pattern: "^[A-Z0-9a-z\._%+-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,4}$"))
    }

    //MARK: - Private

    private func isMatching(expression: NSRegularExpression) -> Bool {
        return expression.numberOfMatches(in: self, range: NSRange(location: 0, length: characters.count)) > 0
    }
}

exemple:

"b@bb.pl".isValidEmail //true
"b@bb".isValidEmail //false

vous pouvez étendre l'extension suivante à tout ce dont vous avez besoin: isValidPhoneNumber , isValidPassword etc...

2
répondu Bartłomiej Semańczyk 2017-05-10 10:14:15

semble fonctionner aussi...

let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"

func validate(email: String) -> Bool {
    let matches = email.rangeOfString(regex, options: .RegularExpressionSearch)
    if let _ = matches {
        return true
    }
    return false
}
1
répondu Logicopolis 2016-06-10 20:00:05

C'est une nouvelle version pour "la SOLUTION raisonnable" par @Fattie, testé sur Swift 4.1 dans un nouveau fichier appelé String+Email.swift :

import Foundation

extension String {
    private static let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
    private static let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\.){1,5}"
    private static let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,6}"

    public var isEmail: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@", type(of:self).__emailRegex)
        return predicate.evaluate(with: self)
    }
}

ainsi son usage est simple:

let str = "mail@domain.com"
if str.isEmail {
    print("\(str) is a valid e-mail address")
} else {
    print("\(str) is not a valid e-mail address")
}

Je n'aime tout simplement pas ajouter un func aux objets String , Car être une adresse e-mail est inhérent à eux (ou non). Ainsi, une propriété Bool conviendrait mieux qu'une propriété func , d'après ce que j'ai compris.

1
répondu Alejandro Iván 2018-05-15 17:52:07

comme il y a tellement de noms de domaines bizarres de premier niveau maintenant, j'arrête de vérifier la longueur du domaine de premier niveau...

voici ce que j'utilise:

extension String {

    func isEmail() -> Bool {
        let emailRegEx = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
        return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluateWithObject(self)
    } 
}
0
répondu snowmen10 2016-02-26 05:12:54

réponse mise à jour @Arsonik réponse à Swift 2.2, en utilisant moins de code verbeux que d'autres solutions proposées:

extension String {
    func isValidEmail() -> Bool {
        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?.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
    }
}
0
répondu Matias Seijas 2016-08-09 21:26:31

la réponse de @JeffersonBe est proche, mais renvoie true si la chaîne est "quelque chose contenant someone@something.com un email valide" ce qui n'est pas ce que nous voulons. Ce qui suit est une extension sur la chaîne qui fonctionne bien (et permet de tester pour phoneNumber valide et d'autres détecteurs de données à démarrer.

/// Helper for various data detector matches.
/// Returns `true` iff the `String` matches the data detector type for the complete string.
func matchesDataDetector(type: NSTextCheckingResult.CheckingType, scheme: String? = nil) -> Bool {
    let dataDetector = try? NSDataDetector(types: type.rawValue)
    guard let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length)) else {
        return false
    }
    return firstMatch.range.location != NSNotFound
        // make sure the entire string is an email, not just contains an email
        && firstMatch.range.location == 0
        && firstMatch.range.length == length
        // make sure the link type matches if link scheme
        && (type != .link || scheme == nil || firstMatch.url?.scheme == scheme)
}
/// `true` iff the `String` is an email address in the proper form.
var isEmail: Bool {
    return matchesDataDetector(type: .link, scheme: "mailto")
}
/// `true` iff the `String` is a phone number in the proper form.
var isPhoneNumber: Bool {
    return matchesDataDetector(type: .phoneNumber)
}
/// number of characters in the `String` (required for above).
var length: Int {
    return self.characters.count
}
0
répondu Gujamin 2016-09-18 02:40:36

et pour Swift 3 :

extension String {
    func isValidEmail() -> Bool {
        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: NSMakeRange(0, self.characters.count)) != nil
    }
}
0
répondu Danut Pralea 2016-10-14 14:06:07

Mon seul ajout à la liste des réponses serait que pour Linux, NSRegularExpression n'existe pas, c'est en fait RegularExpression

    func isEmail() -> Bool {

    let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}"

    #if os(Linux)
        let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #else
        let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #endif

    return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil

ce compile avec succès à la fois sur macOS et Ubuntu.

0
répondu Andrei Popa 2016-10-26 09:52:54

Voici une extension dans Swift 3

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

il suffit de l'utiliser comme ceci:

if yourEmailString.isValidEmail() {
    //code for valid email address
} else {
    //code for not valid email address
}
0
répondu Gefilte Fish 2017-11-22 15:14:08
//Email validation
func validateEmail(enterEmail:String) -> Bool{
    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:enterEmail)
}

100% de travail et d'essai

"
0
répondu Mr.Javed Multani 2018-03-08 09:24:07

meilleure solution avec le meilleur résultat pour

Swift 4.x

 extension String {

        func validateAsEmail() -> 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: self)
        }
    }
0
répondu Abdelahad Darwish 2018-05-11 14:03:23

j'aime créer l'extension

   extension String {

func isValidateEmail() -> Bool {
    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)
}

}

utilisation:

if emailid.text!.isValidateEmail() == false(){
 //do what ever you want if string is not matched.

}
0
répondu siva kumar 2018-05-15 18:01:05

j'ai amélioré la réponse @Azik. J'autorise des caractères plus spéciaux qui sont autorisés par les lignes directrices, ainsi que retourner quelques cas de bord supplémentaires comme invalides.

le groupe pense qu'autoriser ._%+- dans la partie locale n'est pas correct selon les directives. Voir @Anton Gogolev réponse sur cette question ou voir ci-dessous:

la partie locale de l'adresse e-mail peut utiliser l'un de ces ASCII caractères:

  • lettres latines majuscules et minuscules A à Z et a à z ;

  • chiffres 0 à 9 ;

  • caractères spéciaux !#$%&'*+-/=?^_`{|}~ ;

  • point . , à condition qu'il ne s'agisse pas du Premier ou du dernier caractère sauf s'il est cité, et à condition qu'il n'apparaisse pas consécutivement sauf s'il est cité (par exemple John..Doe@example.com n'est pas autorisé mais "John..Doe"@example.com est autorisé);

  • espace et "(),:;<>@[\] caractères sont autorisés avec restrictions (elles ne sont permises qu'à l'intérieur d'une chaîne citée, comme décrit dans le paragraphe ci-dessous, et, en outre, une barre oblique inverse ou les guillemets doivent être précédés d'une barre oblique inversée); les commentaires sont autorisés

  • avec parenthèses à l'une ou l'autre extrémité de la partie locale; p.ex. john.smith(comment)@example.com et (comment)john.smith@example.com sont tous deux équivalents à john.smith@example.com ;

le code que j'utilise ne permettra pas les caractères spéciaux restricted out of place, mais permettra beaucoup plus d'options que la majorité des réponses ici. Je préférerais une validation plus souple plutôt qu'une erreur de prudence.

if enteredText.contains("..") || enteredText.contains("@@") 
   || enteredText.hasPrefix(".") || enteredText.hasSuffix(".con"){
       return false
}

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: enteredText)
0
répondu JavaBeast 2018-06-02 21:59:12

utilisation de Swift 4.

extension String {
    func isValidEmail() -> Bool {
        let regex = try? NSRegularExpression(pattern: "^(((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])|(\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])|(([a-zA-Z]|\d|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])([a-zA-Z]|\d|-|\.|_|~|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])*([a-zA-Z]|\d|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])))\.)+(([a-zA-Z]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])|(([a-zA-Z]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])([a-zA-Z]|\d|-|_|~|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])*([a-zA-Z]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])))\.?$", options: .caseInsensitive)
        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    }
    func isValidName() -> Bool{
        let regex = try? NSRegularExpression(pattern: "^[\p{L}\.]{2,30}(?: [\p{L}\.]{2,30}){0,2}$", options: .caseInsensitive)

        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    } }

et utilisé

if (textField.text?.isValidEmail())! 
    {
      // bla bla
    }
else 
    {

    }
0
répondu ikbal 2018-09-11 19:12:53

vous pouvez trouver utile un cadre de validation de formulaire réutilisable. Il a créé des règles de champ et vous créez créer vos règles de validation personnalisées en implémentant le protocole FieldValidator.

exemple ci-dessous: import UIKit import FormValidationKit

class ViewController: UIViewController, FormValidationDelegate, FieldValidatorDelegate { var formValidator: FormValidator?

var usernameValidator : FieldValidator?
var emailValidator : FieldValidator?

@IBOutlet weak var usernameTf: UITextField!
@IBOutlet weak var emailTf: UITextField!

@IBAction func didTapButton(sender: AnyObject) {

    formValidator?.submit()
}

override func viewDidLoad() {
    super.viewDidLoad()
    //Initialize the form validator
    formValidator = FormValidator()

    //Create field validators
    //Set nil to first field validator
    usernameValidator = FieldValidator(inputValue: { () -> AnyObject in
        return self.usernameTf.text
    }, rules: [Required(validationError: ValidationError(hint: "Field is required"))], nextValidator: nil, form: formValidator!)
    usernameValidator!.delegate = self


    emailValidator = FieldValidator(inputValue: { () -> AnyObject in
        return self.emailTf.text
    }, rules: [Email(validationError: ValidationError(hint: "Proper email format"))], nextValidator: usernameValidator!, form: formValidator!)
    emailValidator!.delegate = self

    formValidator?.initialValidator = emailValidator!
    formValidator?.delegate = self
}

//per field error delegate method
func didEvaluateField(field: FieldValidator, errors: Array<String>, form: FormValidator) {
    switch field {
    case usernameValidator!:
        println("Username field error")
        break;
    case emailValidator!:
        println("Username field error")
    default:
        println("Field error")
    }
}

//form delegate methods
func didPassFormValidation(form: FormValidation) {
    println(__FUNCTION__)
}

func didFailFormValidation(form: FormValidation) {
    println(__FUNCTION__)
}

lien Github ici

-1
répondu naz 2014-12-02 11:47:47

ou vous pouvez avoir une extension pour le texte optionnel de UITextField:

comment utiliser:

if  emailTextField.text.isEmailValid() {
      print("email is valid")
}else{
      print("wrong email address")
}

extension:

extension Optional where Wrapped == String {
    func isEmailValid() -> Bool{
        guard let email = self else { return false }
        let emailPattern = "[A-Za-z-0-9.-_]+@[A-Za-z0-9]+\.[A-Za-z]{2,3}"
        do{
            let regex = try NSRegularExpression(pattern: emailPattern, options: .caseInsensitive)
            let foundPatters = regex.numberOfMatches(in: email, options: .anchored, range: NSRange(location: 0, length: email.count))
            if foundPatters > 0 {
                return true
            }
        }catch{
            //error
        }
        return false
    }
}
-1
répondu repoguy 2017-11-23 11:21:44

Parfait Regex comme Google Mail

"^[A-Z0-9a-z][a-zA-Z0-9_.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
-2
répondu ami rt 2017-09-22 07:58:04