Zend 中的正则表达式电子邮件验证

Regex email vaildation in Zend

我正在使用 zend 框架的电子邮件验证,当我将电子邮件地址作为 abcde@gester.tech 时,它以无效验证响应。然后我修改验证如下。

$emailValidator= new Validator\EmailAddress(Validator\Hostname::ALLOW_DNS | Validator\Hostname::ALLOW_LOCAL);
        $emailRegex= new Validator\Regex(
            array(
                'pattern' => '/^(?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/',
                'messages'=>array(
                    'regexNotMatch'=>'Make sure your email pattern is correct'
                )
            )
        );
        $emailInp->getValidatorChain()->addValidator($emailValidator)->addValidator($emailRegex);

现在我可以传递电子邮件地址 (abcde@gester.tech) 而不会出现验证错误。但是,如果我将输入作为 abcde@gester 提供,它也将作为有效输入。但我想限制它,我认为这可以通过将正则表达式添加到此验证来实现。我可以知道如何实现吗?

 $emailValidator= new Validator\EmailAddress(
            Validator\Hostname::ALLOW_DNS |
            Validator\Hostname::ALLOW_LOCAL);
        $emailRegex= Validator\Regex(array('pattern' => '/^(?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/'));
        $emailInp->getValidatorChain()->addValidator($emailValidator->addValidator($emailRegex));

Zend 框架中有一个 Regex Validator 支持,它有助于匹配用户定义的正则表达式模式。有一个 pattern 选项,它为给定的验证器设置正则表达式模式。

您可以使用它来匹配用户定义的验证器,即适合您需要的模式。

语法:

$validator = new Zend\Validator\Regex(array('pattern' => '/your_desired_regex_pattern_here/'));

为了匹配适合您需要的有效电子邮件地址,您可以使用可用的电子邮件地址正则表达式验证器填写模式。同样根据 Zend docs;正则表达式验证器使用 PCRE(php) 语法,因此您可以使用 PCRE 正则表达式风格。

示例:

$validator = new Zend\Validator\Regex(array('pattern' => '/^(?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/'));

$validator->isValid("abcde@gester.tech"); // returns true
$validator->isValid("abcde@gester"); // returns false
$validator->isValid("Someemail@someDomain.com"); // returns true

如果您想在单个输入数据上链接多个验证器,您还可以使用以下语法:

$validatorChain = new Zend_Validate();
$validatorChain->addValidator(
                    new Zend\Validator\Regex(array('pattern' => '/^(?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/'))
               ->addValidator(new Zend_Validate_Alnum()); // Second validator...You can chain multiple

if ($validatorChain->isValid($input_email)) {
    // email passed validation
} else {
    // email failed validation; print reasons
    foreach ($validatorChain->getMessages() as $message) {
        echo "$message\n";
    }
}

你可以在here.

中找到上述正则表达式的演示

参考:验证电子邮件地址的正则表达式取自this答案。