Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 检查电子邮件地址在iOS上是否有效_Objective C_Cocoa_Email_Email Validation - Fatal编程技术网

Objective c 检查电子邮件地址在iOS上是否有效

Objective c 检查电子邮件地址在iOS上是否有效,objective-c,cocoa,email,email-validation,Objective C,Cocoa,Email,Email Validation,可能重复: 我正在开发一个iPhone应用程序,我需要用户在登录时提供他的电子邮件地址 检查电子邮件地址是否有效的最佳方法是什么?要验证电子邮件字符串,您需要编写正则表达式以检查其格式是否正确。网上有很多,但要小心,因为有些人可能会排除真正合法的地址 从本质上讲,它看起来是这样的 ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle&

可能重复:

我正在开发一个iPhone应用程序,我需要用户在登录时提供他的电子邮件地址


检查电子邮件地址是否有效的最佳方法是什么?

要验证电子邮件字符串,您需要编写正则表达式以检查其格式是否正确。网上有很多,但要小心,因为有些人可能会排除真正合法的地址

从本质上讲,它看起来是这样的

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
以下代码::)以下以下以下代码:::)以下以下以下以下代码::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[[[[[[\x01-x01-\x01-x01-x01-\x01-\x01-x01-\x01-x01-x01-x01-X0-X0-Z0-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z[a-zA-Z\d\-]+(?)$ 实际上,检查电子邮件是否存在且没有反弹意味着发送一封电子邮件并查看结果。例如,它是否反弹。但是,它可能在几个小时内没有反弹,或者根本没有反弹,仍然不是“真实的”电子邮件地址。有许多服务声称为您提供这些服务,可能会由您支付,坦白说,为什么要费心去看它是否真实

检查用户是否有错发电子邮件是很好的,否则他们可能会错误地输入电子邮件,没有意识到,然后因为没有回复而被你黑客攻击。但是,如果有人想添加一个错误的电子邮件地址,没有什么可以阻止他们在hotmail或yahoo(或许多其他地方)上创建该地址来达到同样的目的

因此,请执行正则表达式并验证结构,但不要考虑针对服务进行验证。

好的cocoa函数:

-(BOOL) NSStringIsValidEmail:(NSString *)checkString
{
   BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
   NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
   NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
   NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
   NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
   return [emailTest evaluateWithObject:checkString];
}
关于宽松与严格的讨论-

由于类别更好,您还可以添加一个界面:

@interface NSString (emailValidation) 
  - (BOOL)isValidEmail;
@end
实施

@implementation NSString (emailValidation)
-(BOOL)isValidEmail
{
  BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
  NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
  NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
  NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
  NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
  return [emailTest evaluateWithObject:self];
}
@end
然后利用:

if([@"emailString@email.com" isValidEmail]) { /* True */ }
if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ }

要检查字符串变量是否包含有效的电子邮件地址,最简单的方法是使用正则表达式对其进行测试

这里有一个相对简单的方法,它倾向于允许一些无效地址通过:
^[a-Z0-9.\u%+-]+@[a-Z0-9.-]+\[a-Z]{2,6}$

如何使用正则表达式取决于您使用的iOS版本

iOS 4.x及更高版本 您可以使用
NSRegularExpression
,它允许您直接针对正则表达式进行编译和测试

iOS 3.x 不包括
NSRegularExpression
类,但包括可以与正则表达式匹配的
NSPredicate

NSString *emailRegex = ...;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
BOOL isValid = [emailTest evaluateWithObject:checkString];
在上阅读有关此方法的完整文章

iOS 2.x
Cocoa库中不包含任何正则表达式匹配。但是,您可以轻松地将其包含在项目中,这样您就可以访问iOS 2.0中包含的C级正则表达式API。

这里有一个很好的NSRegularExpression,它适合我

[字符串的文本范围:@“^.+@.+\\..{2,}$”选项:NSRegularExpressionSearch]。位置!=NSNotFound;


您可以插入任何您想要的正则表达式,但我喜欢能够在一行中插入它。

这是一封有效的电子邮件user@mac.com或者有效,因为它是一个真实的电子邮件,存在并将接受邮件?我想要两者,如果abc@xyz.com是否有效,或者用户是否提供了任何无效id(例如abc.com)我还要检查一下abc@xyz.com是将接受邮件的真实电子邮件。无法检查第二个条件。要检查字符串是否为有效电子邮件,只需扫描它以查看“@”和。这是一个非常好的正则表达式。要使用它,您需要针对具有NSRegularExpression类的iOS 4.0,或者使用其中一个为以前版本的iOS编译的regex静态库。实际上,您可以使用NSPredicate,它可以处理正则表达式。我使用的是
NSString*stricterFilterString=@“^[[u A-Za-z0-9-+]+(\\.[u A-Za-z0-9-+])*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\\.[A-Za-z]{2,4}$”
谢谢@WarifAkhandRishi——我已经更新了字符串以处理您的否定测试用例。或者在swift中;
func-isValidEmail(checkString:NSString,strictFilter-strict:Bool)->Bool{var-stricterFilterString=“[A-Z0-9a-z\.+%+@[A-Za-Z0-9-][A-Za-z]+\.+\+\][2,4}”;var-string=“[A-Za-Z0-Z0-9]+\+\][A-z]+\+\+++\];var emailRegex=strict?stricterFilterString:laxString;var emailTest:NSPredicate=NSPredicate(格式:“自匹配%@”,emailRegex);返回emailTest.evaluateWithObject(检查字符串);}
像.museum和.travel这样的新TLD将无法通过严格的测试。如果我使用space charector输入emai laddress,此验证将失败。这在Swift中是一个更好的选项,因为
rangeOfString()
返回一个可选项,如果没有匹配项,则返回
nil