【问题标题】:Email validation for specific domains特定域的电子邮件验证
【发布时间】:2015-05-16 17:35:07
【问题描述】:

我需要电子邮件验证方面的帮助,此验证代码所有电子邮件都采用特定格式,例如 test@test.gov.au、test@something.ac.au,我希望它允许采用 test@something.au 格式

(注意:这里我只允许访问 gov.au、edu.au、govt.nz、ac.au 和 csiro.au 5 个域)

我的代码如下

JS:

function emailTldValidation(tlds) {
            $.validator.addMethod("emailTld", function(value,element) {
              if (value.search("@") != -1) {
                    return (/(.+)@(.+)\.(gov\.au|edu\.au|ac\.nz|csiro\.au|govt\.nz)$/).test(value);
                    //return (/(.+)@(.+)\.(csiro\.au|gov|gov\.us)$/).test(value);
                }
                return false;
            },"Please enter valid tld like "+tlds); 

            $.validator.addClassRules({
                stringInput: {
                    emailTld: true
                }
            });
        }

以下代码在function.php中验证

function validateEmail($email) {
        //validate email here from server side
        if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
            //validate tld
            $validTlds = str_replace(".", "\.", VALID_EMAIL_TLDS);
            $validTlds = "\.".str_replace(",", "|\.", $validTlds);
            $emailArr = explode("@", $email);
            $emailTld = $emailArr[1];
            if (preg_match('/^[-a-z0-9]+\.[a-z][a-z]|('.$validTlds.')\z/', strtolower($emailTld))) {
                //check main domain here
                $exValidTlds = explode(",", VALID_EMAIL_TLDS);
                $exValidTlds = array_map('trim', $exValidTlds);
                foreach($exValidTlds as $tld) {//if exist then
                    if(strstr($emailTld, ".".$tld)) {
                        if($tld == strrchr($emailTld, $tld)) {
                            return true;
                        }
                    }
                }
                return false;
            }
        }

【问题讨论】:

    标签: javascript php validation


    【解决方案1】:

    function validateEmail($email) {
    		//validate email here from server side
    		if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    			//validate tld
    			$validTlds = str_replace(".", "\.", VALID_EMAIL_TLDS);
    			$validTlds = "\.".str_replace(",", "|\.", $validTlds);
    
    			//$validTlds = str_replace(",", "|\.", $validTlds);
    			$emailArr = explode("@", $email);
    
    			$emailTld = $emailArr[1];
    			
    			if ($emailTld == 'csiro.au')
    			{
    				//check main domain here
    				
    				return true;
    			
    			}
    			elseif (preg_match('/^[-a-z0-9]+('.$validTlds.')\z/', strtolower($emailTld))) {
    			
    			
    				//check main domain here
    				$exValidTlds = explode(",", VALID_EMAIL_TLDS);
    				$exValidTlds = array_map('trim', $exValidTlds);
    				foreach($exValidTlds as $tld) {//if exist then
    
    					if(strstr($emailTld, ".".$tld)) {
    						if($tld == strrchr($emailTld, $tld)) {
    							return true;
    						}
    					}
    				}
    				return false;
    			}
    		}
    		return false;	
    	}

    这个正则表达式对我来说效果很好:

    .+@(?:(?:govt*)|(?:edu)|(?:ac)|(?:csiro))\.(?:au|nz)
    

    我使用这个工具来创建它:http://regexpal.com/

    仅供参考,验证电子邮件非常困难http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

    编辑:重新阅读您的问题后,您似乎可能需要对带有子域等的电子邮件进行验证。这可能更适合更开放的域:

    .+@(?:\w+\.\w+)
    

    编辑 2:所以问题是您的验证对于您的复杂性来说太轻了。

    .+@(?:(?:.+\.(?:(?:govt*)|(?:edu)|(?:ac))\.(?:au|nz))|(?:csiro\.au))
    

    分解:

    .+         // Match at least 1 of any character
    @          // An @ symbol
    (?:        // The group of everything right of the @ symbol
    (?:        // The group of domains that have subdomains
    .+\.       // At least one character in front of a .
    (?:        // govt, edu or ac
    \.         // a dot
    (?:        // au or nz
    (?:        // or simply 'csiro.au'
    

    您无法回避这样一个事实,即您的四个域需要一个子域,而一个不需要。

    【讨论】:

    • 谢谢@dclowd9901:但它不适用于我的代码......因为有特定的限制,只有something@smthng.gov.au 或something@smthing.ac.au,或something@smthing仅允许使用 .govt.nz 或 something@smthing.edu.au 或 something@csiro.au 电子邮件格式。其他都工作正常,但它显示 something@csiro.au 作为无效的电子邮件 ID。我也需要允许这样做。
    • 那是你的代码,我不能帮你,因为一切看起来都很好。
    • 这是一个 jsbin:jsbin.com/ririyeziga/1 现在的问题不是正则表达式。一定是别的东西。
    • 感谢@dclowd9901...问题已通过使用此验证码解决
    猜你喜欢
    • 2013-12-13
    • 2018-04-30
    • 2022-12-05
    • 1970-01-01
    • 2016-05-12
    • 2017-06-23
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多