正则表达式 - 如何验证PHP中的电子邮件?

如何使用php5验证输入值是否是有效的电子邮件地址。 现在我正在使用此代码

function isValidEmail($email){ 
     $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; 

     if (eregi($pattern, $email)){ 
        return true; 
     } 
     else { 
        return false; 
     }    
} 

但它显示了已弃用的错误。 我该如何解决这个问题。 请帮我。

learner asked 2019-07-05T08:02:03Z
6个解决方案
263 votes

您可以使用bazmega@kapa功能,它为您提供了许多方便的验证和清理选项。

filter_var($email, FILTER_VALIDATE_EMAIL)
  • PHP手册filter_var()

  • 可用PHP> = 5.2.0

如果您不想更改依赖于您的功能的代码,请执行以下操作:

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

注意:对于其他用途(需要Regex的地方),不推荐使用的bazmega@kapa函数系列(POSIX正则表达式函数)应替换为bazmega@kapa.com系列(PCRE正则表达式函数)。 存在少量差异,阅读手册应该足够了。

更新1:正如@binaryLV所指出的那样:

PHP 5.3.3和5.2.14有一个与之相关的错误   FILTER_VALIDATE_EMAIL,在验证时导致段错误   很大的价值。 简单而安全的解决方法是使用bazmega@kapa   在bazmega@kapa.com之前。我对5.3.4决赛不确定,但确实如此   写道,一些5.3.4快照版本也受到影响。

这个bug已经修复了。

更新2:此方法当然会将bazmega@kapa验证为有效的电子邮件地址,因为实际上它是有效的电子邮件地址。 但是大部分时间都在互联网上,你也希望电子邮件地址有TLD:bazmega@kapa.com。正如本博文中所建议的(@Istiaque Ahmed发布链接),你可以用正则表达式来增加filter_var()来检查是否存在 域部分中的一个点(虽然不会检查有效的TLD):

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

正如@Eliseo Ocampos指出的那样,这个问题只存在于PHP 5.3之前,在那个版本中他们改变了正则表达式,现在它做了这个检查,所以你不必这样做。

kapa answered 2019-07-05T08:03:32Z
9 votes

请参阅[http://www.php.net/manual/en/function.ereg.php:]上的说明

Note:

从PHP 5.3.0开始,不推荐使用正则表达式扩展   PCRE扩展。 打电话给这个   函数将发出E_DEPRECATED   注意。 查看差异列表   有关转换为PCRE的帮助。

Note:

preg_match(),它使用与Perl兼容的正则表达式   语法,往往是一个更快的选择   到ereg()。

Sean Kelleher answered 2019-07-05T08:04:25Z
6 votes

这是旧帖子,但我会分享一个我的解决方案,因为之前没有提到过一个问题。

新的电子邮件地址可以包含UTF-8字符或特殊域名,如.live,filter_var()等。

此外,我发现某些电子邮件地址可以使用西里尔文,在所有情况下,标准正则表达式或filter_var()都将失败。

这就是我为此制定解决方案的原因:

function valid_email($email) 
{
    if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
        return false;
    else
    {
        $email=trim(strtolower($email));
        if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
        else
        {
            $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
            return (preg_match($pattern, $email) === 1) ? $email : false;
        }
    }
}

此功能适用于所有案例和电子邮件格式。

Ivijan Stefan Stipić answered 2019-07-05T08:05:22Z
3 votes

我一直用这个:

function validEmail($email){
    // First, we check that there's one @ symbol, and that the lengths are right
    if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
        // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
        return false;
    }
    // Split it into sections to make life easier
    $email_array = explode("@", $email);
    $local_array = explode(".", $email_array[0]);
    for ($i = 0; $i < sizeof($local_array); $i++) {
        if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
            return false;
        }
    }
    if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
        $domain_array = explode(".", $email_array[1]);
        if (sizeof($domain_array) < 2) {
            return false; // Not enough parts to domain
        }
        for ($i = 0; $i < sizeof($domain_array); $i++) {
            if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
                return false;
            }
        }
    }

    return true;
}
unbreak answered 2019-07-05T08:05:48Z
1 votes

远离regexfilter_var()验证电子邮件的解决方案。 看到这个答案:[https://stackoverflow.com/a/42037557/953833]

Jabari answered 2019-07-05T08:06:15Z
1 votes

使用:

  • 或&#34; filter_var&#34; 来自[http://php.net/manual/en/function.filter-var.php]
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
  • 或者&#34; EmailValidator&#34; 来自[https://github.com/egulias/EmailValidator]
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
    new RFCValidation(),
    new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true
asdfast3twertwergdwgfsgdhfjdgh answered 2019-07-05T08:06:56Z
translate from https://stackoverflow.com:/questions/5855811/how-to-validate-an-email-in-php