验证用户在iOS 2.0上输入的电子邮件地址的最简洁方法是什么?
注意:这是一个特定于iOS 2.0的历史问题,由于其年龄和与其相关的其他问题,它不能退役,不能改为"现代"问题.
使用正则表达式验证电子邮件地址的答案非常详细地解释了RFC 5322中指定的语法对于原始正则表达式而言过于复杂.
我推荐像MKEmailAddress这样的真正的解析器方法.
作为快速正则表达式解决方案,请参阅DHValidation的此修改 :
- (BOOL) validateEmail: (NSString *) candidate { NSString *emailRegex = @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; return [emailTest evaluateWithObject:candidate]; }
阅读RFC.几乎每个认为他们知道如何解析/清理/验证电子邮件地址的人都是错误的.
http://tools.ietf.org/html/rfc2822 第3.4.1节非常有用.注意
dtext = NO-WS-CTL / ; Non white space controls %d33-90 / ; The rest of the US-ASCII %d94-126 ; characters not including "[", ; "]", or "\"
是的,这意味着+,'等都是合法的.
到目前为止我找到的最好的解决方案(以及我最终得到的解决方案)是将RegexKitLite添加到项目中,该项目通过NSString Categories提供对正则表达式的访问.
添加到项目中非常轻松,一旦到位,任何正则表达式电子邮件验证逻辑都将起作用.
一个好的开始是决定你和你不想接受什么作为电子邮件地址?
99%的电子邮件地址如下所示:bob.smith@foo.com或fred@bla.edu
但是,拥有这样的电子邮件地址在技术上是合法的:f !#$%&'*+-/=?^_
{|}〜"ha!"@ com
对于顶级域名,世界上可能只有少数有效的电子邮件,并且几乎没有人使用其他大多数字符(特别是引号和反引号),因此您可能希望假设这些都是无效的事情.但你应该做出有意识的决定.
除此之外,做Paul所说的并尝试将输入与正则表达式匹配如下:^ [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] +.[AZ] { 2,} $
那个人几乎会匹配每个人的电子邮件地址.
虽然对正则表达式的关注很好,但这只是第一个必要的步骤.还有其他步骤也需要考虑一个好的验证策略.
我头顶的两件事是:
DNS验证以确保域实际存在.
在DNS验证之后,您还可以选择执行smtp验证.向smtp服务器发送呼叫以查看用户是否确实存在.
通过这种方式,您可以捕获各种用户错误并确保它是有效的电子邮件.
此功能很简单,但更彻底地检查电子邮件地址.例如,根据RFC2822,电子邮件地址不得包含连续的两个句点,例如firstname..lastname @ domain..com
在正则表达式中使用锚也很重要,如此函数中所示.没有锚点,以下电子邮件地址被认为是有效的:第一个;名称)lastname@domain.com(因为lastname@domain.com部分有效,首先忽略;名称)在开头和(等等).锚点强制正则表达式引擎来验证整个电子邮件.
此功能使用NSPredicate,这在iOS 2中不存在.不幸的是,它可能无法帮助提问者,但希望能帮助其他人使用更新版本的iOS.此函数中的正则表达式仍可应用于iOS 2中的RegExKitLite.对于使用iOS 4或更高版本的用户,可以使用NSRegularExpression实现这些正则表达式.
- (BOOL)isValidEmail:(NSString *)email { NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z"; NSString *regex2 = @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*"; NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1]; NSPredicate *test2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2]; return [test1 evaluateWithObject:email] && [test2 evaluateWithObject:email]; }
请参阅使用Objective-C中的正则表达式验证电子邮件地址.
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.