Anda seharusnya tidak mencoba menggunakan regex untuk memvalidasi email. Dengan TLD yang terus berubah, validator Anda tidak lengkap atau tidak akurat. Sebaliknya, Anda harus memanfaatkan NSDataDetector
perpustakaan Apple yang akan mengambil string dan mencoba untuk melihat apakah ada bidang data yang diketahui (email, alamat, tanggal, dll). SDK Apple akan melakukan banyak hal untuk tetap mengikuti perkembangan TLD dan Anda dapat mendukung upaya mereka !! :)
Selain itu, jika iMessage (atau bidang teks lainnya) tidak menganggapnya sebagai email, haruskah Anda mempertimbangkan email?
Saya menempatkan fungsi ini dalam NSString
kategori, jadi string yang Anda uji adalah 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]]);
}
atau sebagai String
ekstensi cepat
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)"
}
}