如何用PHP验证电子邮件?

2022-08-30 07:07:40

如何使用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; 
     }    
} 

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


答案 1

您可以使用该函数,它为您提供了许多方便的验证和清理选项。filter_var()

filter_var($email, FILTER_VALIDATE_EMAIL)

如果您不想更改依赖于您的函数的代码,只需执行以下操作:

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

注意:对于其他用途(需要正则表达式),不推荐使用的函数系列(POSIX 正则表达式函数)应替换为该系列(PCRE 正则表达式函数)。有少量的差异,阅读手册应该就足够了。eregpreg

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

PHP 5.3.3 和 5.2.14 有一个与 FILTER_VALIDATE_EMAIL 相关的 bug,导致在验证大值时出现 segfault。简单安全的解决方法是使用之前。我不确定5.3.4 final,但据记载,一些5.3.4快照版本也受到了影响。strlen()filter_var()

此错误已修复。

更新2:此方法当然会验证为有效的电子邮件地址,因为实际上它是有效的电子邮件地址。但大多数时候在互联网上,您还希望电子邮件地址具有TLD:。正如这篇博客文章@Istiaque Ahmed发布的链接)中所建议的那样,您可以使用正则表达式进行扩充,该正则表达式将检查域部分中是否存在点(尽管不会检查有效的TLD):bazmega@kapabazmega@kapa.comfilter_var()

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

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


答案 2

请参阅 http://www.php.net/manual/en/function.ereg.php 中的注释:

Note:

从 PHP 5.3.0 开始,正则表达式扩展被弃用,取而代之的是 PCRE 扩展。调用此函数将发出E_DEPRECATED通知。请参阅差异列表,以获取有关转换为 PCRE 的帮助。

Note:

preg_match()使用与Perl兼容的正则表达式语法,通常是erg()的更快替代方案。


推荐