检查电子邮件地址是否格式正确的最简单、最安全的方法是使用filter_var() 函数:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
此外,您可以检查域是否定义了MX 记录:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
但这仍然不能保证邮件存在。找出答案的唯一方法是发送确认邮件。
现在您有了简单的答案,如果您想学习或只是使用快速答案并继续前进,请随时阅读有关电子邮件地址验证的信息。没有难过的感觉。
尝试使用正则表达式验证电子邮件地址是一项“不可能”的任务。我什至会说你所做的那个正则表达式是没用的。有三个关于电子邮件地址的 rfc,编写正则表达式来捕获错误的电子邮件地址,同时没有误报,这是凡人无法做到的。查看 this list 以了解 PHP 的 filter_var() 函数使用的正则表达式的测试(失败和成功)。
即使是内置的 PHP 函数、电子邮件客户端或服务器也无法正确处理。在大多数情况下,filter_var 仍然是最佳选择。
如果您想知道 PHP(当前)使用哪种正则表达式模式来验证电子邮件地址,请参阅 the PHP source。
如果您想了解有关电子邮件地址的更多信息,我建议您开始阅读规范,但我必须警告您,这无论如何都不容易阅读:
请注意,filter_var() 已经说明仅在 PHP 5.2 中可用。如果您希望它与早期版本的 PHP 一起使用,您可以使用 PHP 中使用的正则表达式:
<?php
$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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
附注关于上面使用的正则表达式模式的注释(来自 PHP 源代码)。看起来Michael Rushton 有一些版权。如前所述:“请随意使用和重新分发此代码。但请保留此版权声明。”