如何在PHP中验证电子邮件地址
我使用此功能验证电子邮件地址:如何在PHP中验证电子邮件地址,php,regex,email,email-validation,Php,Regex,Email,Email Validation,我使用此功能验证电子邮件地址: function validateEMAIL($EMAIL) { $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/"; return (bool)preg_match($v, $EMAIL); } 检查电子邮件地址是否有效可以吗?检查电子邮件地址格式是否正确最简单、最安全的方法是使用以下功能: if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
检查电子邮件地址是否有效可以吗?检查电子邮件地址格式是否正确最简单、最安全的方法是使用以下功能:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
此外,您还可以检查域是否定义了MX
记录:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
但这仍然不能保证邮件的存在。找到答案的唯一方法是发送确认邮件
现在,您已经有了简单的答案,如果您想了解或不想了解,请随时阅读有关电子邮件地址验证的内容,只需使用快速答案,然后继续前进。没有不愉快的感觉 尝试使用正则表达式验证电子邮件地址是一项“不可能”的任务。我甚至可以说你做的正则表达式是无用的。关于电子邮件地址,有三个rfc,写一个正则表达式来捕捉错误的电子邮件地址,同时不出现误报,这是任何凡人都做不到的。检查PHP的
filter\u var()
函数使用的正则表达式的测试(失败和成功)
即使是内置的PHP函数、电子邮件客户端或服务器也无法正确使用。在大多数情况下,filter\u var
仍然是最佳选择
如果您想知道PHP(当前)使用哪个正则表达式模式来验证电子邮件地址,请参阅
如果您想了解更多有关电子邮件地址的信息,我建议您开始阅读规范,但我必须警告您,无论如何阅读都不容易:
- (允许使用unicode字符,但许多客户端/服务器不接受此字符)
filter\u var()
如前所述仅在PHP5.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的内置功能-在这种情况下:
当随过滤器\u验证\u电子邮件提供时,它可以返回true或false。
参数。您可以使用它
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
在有关电子邮件验证的“首要问题”中回答了这个问题
对我来说,检查电子邮件的正确方法是:
检查符号@是否存在,以及在其前后是否存在一些非@符号:/^[^@]+@[^@]+$/
尝试向此地址发送带有“激活码”的电子邮件
当用户“激活”他的电子邮件地址时,我们将看到一切正常
当然,当用户需要时,可以在前端显示一些警告或工具提示
键入“奇怪”的电子邮件,以帮助他避免常见错误,如“否”
域中的点或名称中的空格不加引号等。但是
您必须接受地址“hello@world“如果用户真的想要它
此外,您必须记住,电子邮件地址标准过去是,现在也可以
evolute,所以不能一次又一次地键入一些“标准有效”的regexp
永远。你必须记住,一些具体的互联网
服务器可能会在公共标准的某些细节上出现故障,事实上,服务器可以与
拥有“修改后的标准”
所以,只需检查@,在前端提示用户并在给定地址上发送验证电子邮件。如果您只是在寻找一个允许各种点、下划线和破折号的实际正则表达式,它如下所示:[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+[a-zA-Z]+
。这将允许一封看起来相当愚蠢的电子邮件,比如tom_anderson.1-neo@my-mail_matrix.com
待验证。根据我的经验,regex
解决方案有太多的误报,而filter_var()
解决方案有误报(尤其是所有较新的解决方案)
相反,最好确保该地址包含电子邮件地址的所有必需部分(用户“@”符号和域),然后验证域本身是否存在
无法确定(服务器端)是否存在外部域的电子邮件用户
这是我在实用程序类中创建的一个方法:
public static function validateEmail($email)
{
// SET INITIAL RETURN VARIABLES
$emailIsValid = FALSE;
// MAKE SURE AN EMPTY STRING WASN'T PASSED
if (!empty($email))
{
// GET EMAIL PARTS
$domain = ltrim(stristr($email, '@'), '@') . '.';
$user = stristr($email, '@', TRUE);
// VALIDATE EMAIL ADDRESS
if
(
!empty($user) &&
!empty($domain) &&
checkdnsrr($domain)
)
{$emailIsValid = TRUE;}
}
// RETURN RESULT
return $emailIsValid;
}
这不仅可以验证您的电子邮件,还可以清除其中的意外字符:
$email = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
$emailB != $email
) {
echo "This email adress isn't valid!";
exit(0);
}
现在,如果你使用HTML5表单,并且type=email
,那么你已经安全了80%,因为浏览器引擎有自己的验证器。要对其进行补充,请将此正则表达式添加到您的preg\u match\u all()
,并将其取反:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
如果要检查从电子邮件地址提供的域是否有效,请使用以下方法:
/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
function check_email_domain($email) {
//Get host name from email and check if it is valid
$email_host = explode("@", $email);
//Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
$host = end($email_host) . ".";
//Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)
}
}
这是一种过滤大量无效电子邮件地址的简便方法,还可以进行标准电子邮件验证,因为有效的电子邮件格式并不意味着有效的电子邮件
请注意,idn_to_ascii()
(或其姐妹函数idn_to_utf8()
)函数在PHP安装中可能不可用,它需要扩展名PECL intl>=1.0.2和PECL idn>=0.1
还请记住,无法验证电子邮件中作为域部分的IPv4或IPv6(例如user@[IPv6:2001:db8::1]
),只能验证命名主机
查看更多信息。在阅读了这里的答案后,我得出了以下结论:
public static function isValidEmail(string $email) : bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host,FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host.'.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
return false;
}
}
return true;
}
使用以下代码:
//要检查的变量
$email=“约翰。doe@example.com";
//从电子邮件中删除所有非法字符
$email=filter\u var($email,filter\u SANITIZE\u email);
//验证电子邮件
if(过滤变量($email,过滤验证电子邮件)){
echo(“电子邮件是有效的电子邮件地址”);
}否则{
echo(“Oppps!电子邮件不是有效的电子邮件地址”);
}
如果它起作用,它就起作用。你不能把它做得更好,它太小了。唯一不好的是风格validateEmail
将是正确的,并且传递$email
,而不是$email
。只是想确保代码中没有任何重大问题,仅此而已:)另请参阅有关如何以及如何不使用正则表达式验证电子邮件地址的详细信息。这将无法验证许多有效的电子邮件地址。例如*@example.com或'@example.com或我[127.0.0.1]或你[ipv6:08B0:1123:AAAA::1234]@jcoder,
public static function isValidEmail(string $email) : bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host,FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host.'.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
return false;
}
}
return true;
}