คุณไม่ควรลองใช้ regex เพื่อตรวจสอบอีเมล ด้วยการเปลี่ยน TLDs เครื่องมือตรวจสอบของคุณจะไม่สมบูรณ์หรือไม่ถูกต้อง แต่คุณควรใช้ประโยชน์จากNSDataDetector
ห้องสมุดของ Apple ซึ่งจะใช้สตริงและลองดูว่ามีเขตข้อมูลที่รู้จัก (อีเมลที่อยู่วันที่ ฯลฯ ) หรือไม่ SDK ของ Apple จะยกระดับการติดตาม TLD อย่างหนักและคุณสามารถนำความพยายามออกมาได้ !! :)
นอกจากนี้หาก iMessage (หรือช่องข้อความอื่น ๆ ) ไม่คิดว่าเป็นอีเมลคุณควรพิจารณาอีเมลหรือไม่
ฉันใส่ฟังก์ชั่นนี้ในหมวดหมู่เพื่อให้สายที่คุณกำลังทดสอบคือNSString
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]]);
}
หรือเป็นString
ส่วนขยายที่รวดเร็ว
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)"
}
}