ईमेल को मान्य करने के लिए आपको regex का उपयोग करने का प्रयास नहीं करना चाहिए। कभी भी TLD को बदलने के साथ, आपका सत्यापनकर्ता अधूरा या गलत है। इसके बजाय, आपको ऐप्पल के NSDataDetector
पुस्तकालयों का लाभ उठाना चाहिए जो एक स्ट्रिंग लेंगे और यह देखने की कोशिश करेंगे कि क्या कोई ज्ञात डेटा फ़ील्ड (ईमेल, पते, दिनांक, आदि) हैं। एप्पल के एसडीके टीएलडी के साथ अद्यतित रखने की भारी उठाने की कोशिश करेंगे और आप उनके प्रयासों से दूर हो सकते हैं !! :)
इसके अलावा, अगर 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)"
}
}