iPhone中电子邮件的验证

3
我实现了以下代码。它可以接受任何类型的电子邮件地址,例如:abc@xyz.com。但我想要接受正确的电子邮件地址,例如:abc@gmail.com、abc@yahoo.com。有人能指导如何做到这一点吗?
- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

感谢您的提前帮助。

这段代码有什么错误? - Nimit Parekh
你的意思是只接受来自有效电子邮件域的电子邮件地址吗? - Nick Bull
是的,我想要接受有效的电子邮件地址。 - siva
唯一的方法是获取输入的电子邮件地址,然后查询他们提供的域名上的电子邮件服务器。否则,您将无法知道所有有效的域名。 - Nick Bull
2个回答

2

编辑:添加了域名检查

以下代码将检查域名和扩展名,如果需要,可以随意添加所需的名称。

     - (BOOL)isValidEmail:(NSString *)inputText
        {
            NSString *emailRegex = @"[A-Z0-9a-z][A-Z0-9a-z._%+-]*@[A-Za-z0-9][A-Za-z0-9.-]*\\.[A-Za-z]{2,6}"; 
            NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
            NSRange dotRange;
            NSRange atRange;

            BOOL isValidDomain = NO;
            BOOL isValidSite = NO;

            if([emailTest evaluateWithObject:inputText]) 
            {
                dotRange = [inputText rangeOfString:@"." options:NSBackwardsSearch range:NSMakeRange(0, [inputText length])];
                int indexOfDot = dotRange.location;

                if(dotRange.location != NSNotFound) 
                {
                    NSString *topLevelDomain = [inputText substringFromIndex:indexOfDot];
                    topLevelDomain = [topLevelDomain lowercaseString];
                    NSSet *TLD;
                    TLD = [NSSet setWithObjects:@".aero", @".asia", @".biz", @".cat", @".com", @".coop", @".edu", @".gov", @".info", @".int", @".jobs", @".mil", @".mobi", @".museum", @".name", @".net", @".org", @".pro", @".tel", @".travel", @".ac", @".ad", @".ae", @".af", @".ag", @".ai", @".al", @".am", @".an", @".ao", @".aq", @".ar", @".as", @".at", @".au", @".aw", @".ax", @".az", @".ba", @".bb", @".bd", @".be", @".bf", @".bg", @".bh", @".bi", @".bj", @".bm", @".bn", @".bo", @".br", @".bs", @".bt", @".bv", @".bw", @".by", @".bz", @".ca", @".cc", @".cd", @".cf", @".cg", @".ch", @".ci", @".ck", @".cl", @".cm", @".cn", @".co", @".cr", @".cu", @".cv", @".cx", @".cy", @".cz", @".de", @".dj", @".dk", @".dm", @".do", @".dz", @".ec", @".ee", @".eg", @".er", @".es", @".et", @".eu", @".fi", @".fj", @".fk", @".fm", @".fo", @".fr", @".ga", @".gb", @".gd", @".ge", @".gf", @".gg", @".gh", @".gi", @".gl", @".gm", @".gn", @".gp", @".gq", @".gr", @".gs", @".gt", @".gu", @".gw", @".gy", @".hk", @".hm", @".hn", @".hr", @".ht", @".hu", @".id", @".ie", @" No", @".il", @".im", @".in", @".io", @".iq", @".ir", @".is", @".it", @".je", @".jm", @".jo", @".jp", @".ke", @".kg", @".kh", @".ki", @".km", @".kn", @".kp", @".kr", @".kw", @".ky", @".kz", @".la", @".lb", @".lc", @".li", @".lk", @".lr", @".ls", @".lt", @".lu", @".lv", @".ly", @".ma", @".mc", @".md", @".me", @".mg", @".mh", @".mk", @".ml", @".mm", @".mn", @".mo", @".mp", @".mq", @".mr", @".ms", @".mt", @".mu", @".mv", @".mw", @".mx", @".my", @".mz", @".na", @".nc", @".ne", @".nf", @".ng", @".ni", @".nl", @".no", @".np", @".nr", @".nu", @".nz", @".om", @".pa", @".pe", @".pf", @".pg", @".ph", @".pk", @".pl", @".pm", @".pn", @".pr", @".ps", @".pt", @".pw", @".py", @".qa", @".re", @".ro", @".rs", @".ru", @".rw", @".sa", @".sb", @".sc", @".sd", @".se", @".sg", @".sh", @".si", @".sj", @".sk", @".sl", @".sm", @".sn", @".so", @".sr", @".st", @".su", @".sv", @".sy", @".sz", @".tc", @".td", @".tf", @".tg", @".th", @".tj", @".tk", @".tl", @".tm", @".tn", @".to", @".tp", @".tr", @".tt", @".tv", @".tw", @".tz", @".ua", @".ug", @".uk", @".us", @".uy", @".uz", @".va", @".vc", @".ve", @".vg", @".vi", @".vn", @".vu", @".wf", @".ws", @".ye", @".yt", @".za", @".zm", @".zw", nil];
                    if(topLevelDomain != nil && ([TLD containsObject:topLevelDomain])) 
                    {
                        isValidDomain = YES;
                    }
                }
                atRange = [inputText rangeOfString:@"@" options:NSBackwardsSearch range:NSMakeRange(0, [inputText length])];
                int indexOfAt = atRange.location;

                if(atRange.location != NSNotFound)
                {
                    NSString *topLevelSite = [inputText substringWithRange:NSMakeRange(indexOfAt, indexOfDot - indexOfAt)];
                    topLevelSite = [topLevelSite lowercaseString];
                    NSSet *TLS;
//Add your required domain names to the set below
                    TLS = [NSSet setWithObjects:@"@google", @"@yahoo", nil];
                    if(topLevelSite != nil && ([TLS containsObject:topLevelSite])) 
                    {
                        isValidSite = YES;
                    }
                }

            }
            return (isValidDomain && isValidSite);
        }

它运行得很好。但是如果我输入cc@cc.com,它就不会有任何响应。那么我该如何解决这个问题? - siva
编写自己的正则表达式可能比尝试理解别人的更快。 - Kheldar
@siva 我已经根据你的要求更新了我的答案。现在请查看。 - sElanthiraiyan

2

尝试使用这段代码:

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    
    BOOL result = [emailTest evaluateWithObject:candidate];
    if(result)
    {
        NSSet *domains= [NSSet setWithObjects:@"yahoo.com",@"yahoo.co.in",@"yahoo.co.au",@"yahoo.co.nz",@"gmail.com",@"rediffmail.com",.........., nil];
        NSArray *arrayObjects = [domains allObjects];
        BOOL results = NO;
              for(int i = 0;i<[arrayObjects count];i++)
              {
                  if([emailTest rangeOfString:[arrayObjects objectAtIndex:i]].location != NSNotFound)
                  {
                      results = YES;
                      break;
                  }
              }
          return results;
    }
    else
    {
        return NO;
    } 
    return [emailTest evaluateWithObject:candidate];
}

这意味着您将不得不列出互联网上的每个域名,而且每当注册新域名时,您就必须更新应用程序。并非每个人都使用Gmail、Yahoo邮箱等。 - Nick Bull
@NickBull:是的,我知道这不太可行,但如果Siva只想要一些特定的域名,那么这对他来说是可行的。总的来说,整个需求本身非常不同,我认为不可能实现,但如果只针对一些预定义的域名,这可能是一个简单的解决方法。 - Parth Bhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接