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

但它显示了过时的错误。我怎样才能修复这个问题。请帮助我。

199553 次浏览

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

filter_var($email, FILTER_VALIDATE_EMAIL)

如果你不想改变你依赖于你的函数的代码,只要做:

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

注意 : 对于其他用途(需要正则表达式的地方) ,废弃的 ereg函数族(POSIX 正则表达式函数)应该被 preg族(正则表达式函数)取代。有少量的差异,阅读说明书就足够了。

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

PHP 5.3.3和5.2.14的 臭虫与 FILTER _ VALIDATE _ EMAIL,在验证时导致 Segfault 简单而安全的解决办法是使用 strlen()filter_var()之前。我不确定5.3.4决赛,但它是 写道,一些5.3.4-快照版本也受到影响。

这个错误已经被修复了。

更新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、 在那个版本中,他们改变了正则表达式之前,现在它进行了这个检查,所以您不必这样做。

参见 http://www.php.net/manual/en/function.ereg.php的注释:

Note:

从 PHP 5.3.0开始,不推荐使用正则表达式扩展 PCRE 扩展正在呼叫 函数将发出一个 E _ DEPRECATED 请参阅 差异清单 转换为 PCRE 的帮助。

Note:

Preg _ match () ,它使用与 Perl 兼容的正则表达式 语法,通常是一个更快的替代方案 电解质()。

我总是用这个:

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;
}

这是一篇老文章,但我会分享一个我的解决方案,因为没有人在这里提到一个问题之前。

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

此外,我发现一些电子邮件地址可以在西里尔和在所有情况下,标准正则表达式或 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;
}
}
}

这个功能完美的工作,所有情况下和电子邮件格式。

用途:

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true

用户数据对于一个好的开发人员非常重要,所以不要再问了 同样对于相同的数据,使用一些逻辑来纠正数据中的一些基本错误。

在验证电子邮件之前: 首先你必须删除电子邮件中的所有非法字符。

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

之后,使用这个 filter_var()函数验证您的电子邮件地址。

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

举例来说。

<?php
$email = "john.doe@example.com";


// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);


// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo $email." is a valid email address";
} else {
echo $email." is not a valid email address";
}
?>

注意,Iasd@x.z————.com的地址是 INVALID,但 filter _ var ()返回 true,许多其他字符串(电子邮件) INVALIDS 使用 filter _ var ()返回 true。

为了验证电子邮件,我使用这个功能:

function correcorre($s){// correo correcto
$x = '^([[:alnum:]](_|-|\.)*)*[[:alnum:]]+@([[:alnum:]]+(-|\.)+)*[[:alnum:]]+\.[[:alnum:]]+$';
preg_match("!$x!i", $s, $M);
if(!empty($M[0]))return($M[0]);
}

请提高和分享,谢谢