আপনার কোনও ইমেল যাচাই করার জন্য রেজেক্স ব্যবহার করার চেষ্টা করা উচিত নয়। সর্বদা টিএলডি পরিবর্তন করার সাথে আপনার বৈধকারক হয় অসম্পূর্ণ বা ভুল। পরিবর্তে, আপনার অ্যাপলের 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)"
}
}