Vous ne devriez pas essayer d'utiliser regex pour valider un e-mail. Avec des TLD en constante évolution, votre validateur est incomplet ou inexact. Au lieu de cela, vous devriez tirer parti des NSDataDetector
bibliothèques Apple qui prendront une chaîne et essayer de voir s'il existe des champs de données connus (e-mails, adresses, dates, etc.). Le SDK d'Apple fera le gros du travail pour rester à jour avec les TLD et vous pourrez profiter de leurs efforts! :)
De plus, si iMessage (ou tout autre champ de texte) ne pense pas qu'il s'agit d'un e-mail, devriez-vous envisager un e-mail?
J'ai mis cette fonction dans une NSString
catégorie, donc la chaîne que vous testez est self
.
- (BOOL)isValidEmail {
// Trim whitespace first
NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
if (self && self.length > 0) return NO;
NSError *error = nil;
NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
if (!dataDetector) return NO;
// This string is a valid email only if iOS detects a mailto link out of the full string
NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
if (error) return NO;
return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
}
ou comme String
extension rapide
extension String {
func isValidEmail() -> Bool {
let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return false
}
let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))
return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
}
}