如何验证PHP中的电子邮件地址
我有这个功能来验证电子邮件地址:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
这可以检查电子邮件地址是否有效吗?
检查电子邮件地址是否格式正确的最简单最安全的方法是使用filter_var()
函数:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
另外,您可以检查域是否定义MX
记录:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
但是这仍然不能保证邮件的存在。 唯一的办法是发送确认邮件。
现在您可以轻松地阅读关于电子邮件地址验证的简单答案,如果您关心学习或仅使用快速答案并继续前进。 别往心里放。
尝试使用正则表达式验证电子邮件地址是一个“不可能”的任务。 我会尽可能地说,你所做的正则表达式是无用的。 有三个rfc关于emailaddresses,并写一个正则表达式来捕捉错误的电子邮件地址,同时没有误报是没有凡人能做的。 查看PHP的filter_var()
函数使用的正则表达式的测试(失败和成功)列表。
即使内置的PHP函数,电子邮件客户端或服务器也没有正确。 仍然在大多数情况下, filter_var
是最好的选择。
如果您想知道PHP(当前)用于验证电子邮件地址的正则表达式模式,请参阅PHP源代码。
如果您想了解更多关于电子邮件地址的信息,我建议您开始阅读规格说明,但我必须警告您,任何一段时间都不容易阅读:
请注意, filter_var()
仅适用于PHP 5.2。 如果你希望它能与早期版本的PHP一起工作,你可以使用PHP中使用的正则表达式:
<?php
$pattern = '/^(?!(?:(?:x22?x5C[x00-x7E]x22?)|(?:x22?[^x5Cx22]x22?)){255,})(?!(?:(?:x22?x5C[x00-x7E]x22?)|(?:x22?[^x5Cx22]x22?)){65,}@)(?:(?:[x21x23-x27x2Ax2Bx2Dx2F-x39x3Dx3Fx5E-x7E]+)|(?:x22(?:[x01-x08x0Bx0Cx0E-x1Fx21x23-x5Bx5D-x7F]|(?:x5C[x00-x7F]))*x22))(?:.(?:(?:[x21x23-x27x2Ax2Bx2Dx2F-x39x3Dx3Fx5E-x7E]+)|(?:x22(?:[x01-x08x0Bx0Cx0E-x1Fx21x23-x5Bx5D-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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS上面使用的正则表达式模式的注释(来自PHP源代码)。 看起来Michael Rushton有一些版权。 如上所述:“请随意使用并重新发布此代码,但请保留此版权声明。”
你可以为此使用filter_var。
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
我想你可能会更适合使用PHP的内置过滤器 - 在这种情况下:
当提供FILTER_VALIDATE_EMAIL
参数时,它可以返回true或false。