- (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]]);
}
NSString *emailString = textField.text; **// storing the entered email in a string.**
**// Regular expression to checl the email format.**
NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg];
if (([emailTest evaluateWithObject:emailString] != YES) || [emailStringisEqualToString:@""])
{
UIAlertView *loginalert = [[UIAlertView alloc] initWithTitle:@" Enter Email in" message:@"abc@example.com format" delegate:self
cancelButtonTitle:@"OK" otherButtonTitles:nil];
enter code here
[loginalert show];
[loginalert release];
}
If email is invalid, it will remind the user with an alert box.
Hope this might be helpful for you all.
13 回答
我发现使用正则表达式可以很好地验证电子邮件地址 .
当然,正则表达式的主要缺点是可维护性,因此您之前从未评论过评论 . 我保证,如果你不这样做,你会希望你在几周之后回到表达时做 .
这是一个很好的来源链接http://www.regular-expressions.info/email.html .
你不应该使用字符串并尝试查看是否有任何已知的数据字段(电子邮件,地址,日期等) . Apple的SDK将尽最大努力与TLD保持同步,您可以捎带他们的努力! :)
另外,如果iMessage(或任何其他文本字段)认为它不是电子邮件,您是否应该考虑发送电子邮件?
我将此函数放在
NSString
类别中,因此您正在测试的字符串是self
.或者作为一个快速的
String
扩展名挖掘污垢,但我偶然发现了SHEmailValidator,这是一个完美的工作,并有一个很好的界面 .
此功能很简单,但更彻底地检查电子邮件地址 . 例如,根据RFC2822,电子邮件地址不得包含连续的两个句点,例如firstname..lastname @ domain..com
在正则表达式中使用锚也很重要,如此函数中所示 . 没有锚点,以下电子邮件地址被认为是有效的:第一个;名称)lastname@domain.com(因为lastname@domain.com部分是有效的,首先忽略;名称),在开头和(等等) . 锚点强制正则表达式引擎来验证整个电子邮件 .
此功能使用NSPredicate,这在iOS 2中不存在 . 不幸的是,它可能无法帮助提问者,但希望能帮助其他人使用更新版本的iOS . 此函数中的正则表达式仍然可以应用于iOS 2中的RegExKitLite . 对于使用iOS 4或更高版本的用户,可以使用NSRegularExpression实现这些正则表达式 .
见validate email address using regular expression in Objective-C .
Using a regular expression to validate an email address的答案非常详细地解释了RFC 5322中指定的语法对于原始正则表达式而言过于复杂 .
I recommend a real parser approach like MKEmailAddress.
作为快速正则表达式解决方案,请参阅DHValidation的此修改:
一个好的开始是决定你和你不想接受什么作为电子邮件地址?
99%的电子邮件地址如下所示:bob.smith@foo.com或fred@bla.edu
但是,拥有这样的电子邮件地址在技术上是合法的:f
!#$%&'*+-/=?^_
{|}〜"ha!" @com对于顶级域名,世界上可能只有少数有效的电子邮件,而且几乎没有人使用其他大多数字符(特别是引号和反引号),所以你可能想要假设这些都是无效的事情 . 但你应该这样做是有意识的决定 .
除此之外,做Paul所说的并尝试将输入匹配到这样的正则表达式:^ [A-Z0-9 ._% - ] @ [A-Z0-9.-] . [AZ] {2,} $
那个人几乎会匹配每个人的电子邮件地址 .
虽然对正则表达式的关注很好,但这只是第一个必要的步骤 . 还有其他步骤也需要考虑一个好的验证策略 .
我头顶的两件事是:
DNS验证以确保域实际存在 .
在dns验证后,您还可以选择执行smtp验证 . 向smtp服务器发送呼叫以查看用户是否确实存在 .
通过这种方式,您可以捕获各种用户错误并确保它是有效的电子邮件 .
许多网站提供RegExes,但您最好学习和理解它们,并验证您希望它做什么,在官方RFC中为电子邮件地址格式满足您的需求 .
为了学习RegEx,解释语言可以是一个很好的简化和测试平台 . Rubular是基于Ruby构建的,但它是一种快速测试和验证的方法:http://www.rubular.com/
除此之外,购买最新版本的O'Reilly书籍Mastering Regular Expressions . 您需要花时间了解前3或4章 . 之后的一切将是 Build 高度优化的RegEx使用的专业知识 .
通常,一系列更小,更易于管理的RegExs更易于维护和调试 .
这是String的扩展,用于验证Swift中的电子邮件 .
复制自答案:Check that an email address is valid on iOS
到目前为止我找到的最好的解决方案(以及我最终使用的那个)是将RegexKitLite添加到通过NSString Categories访问正则表达式的项目中 .
添加到项目并进入项目是非常轻松的地方,任何正则表达式电子邮件验证逻辑都可以工作 .
阅读RFC . 几乎每个认为他们知道如何解析/清理/验证电子邮件地址的人都是错误的 .
http://tools.ietf.org/html/rfc2822第3.4.1节非常有用 . 注意
是的,这意味着'等等都是合法的 .