为了账号安全,请及时绑定邮箱和手机立即绑定

如何在PHP中验证电子邮件地址

/ 猿问

如何在PHP中验证电子邮件地址

呼唤远方 2019-06-09 16:49:39

如何在PHP中验证电子邮件地址

我有这个功能来验证电子邮件地址:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);}

这可以检查电子邮件地址是否有效吗?


查看完整描述

3 回答

?
冉冉说

检查电子邮件地址是否格式良好的最简单和最安全的方法是使用filter_var()职能:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress}

此外,您还可以检查域是否定义了MX记录:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid}

但这仍然不能保证邮件的存在。只有通过发送确认邮件才能发现这一点。


现在你有了你的简单答案,如果你想学习或者其他的话,可以自由地阅读关于电子邮件地址验证的内容,只需使用快速的答案,然后继续前进。没什么不好的感觉。

尝试使用regex验证电子邮件地址是一项“不可能”的任务。我甚至可以说你所做的审判是无用的。有三个RFC关于电子邮件地址和写一个regex来捕捉错误的电子邮件,同时没有假阳性是没有凡人可以做的事情。检查这份清单对于PHP所使用的正则表达式的测试(包括失败和成功)filter_var()功能。

即使是内置的PHP函数、电子邮件客户端或服务器也不正确。在大多数情况下filter_var是最好的选择。

如果您想知道PHP(当前)使用哪种regex模式来验证电子邮件地址,请参见PHP源程序.

如果您想了解更多关于电子邮件地址的信息,我建议您开始阅读这些规范,但我必须警告您,这并不是一件容易的事情:

请注意filter_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

}

关于上面使用的regex模式的说明(来自PHP源代码)。它看起来好像有一些版权迈克尔·拉什顿..如前所述:“请随意使用和重新分发此代码。但请保留此版权通知。”


查看完整回答
反对 回复 2019-06-09
?
扬帆大鱼

你可以用滤波器无功为了这个。

<?php   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }?>


查看完整回答
反对 回复 2019-06-09
?
繁华开满天机

以我的经验来看,regex解决方案有太多的错误,而且filter_var()解决方案有错误的负面(特别是所有更新的)。TLDs).

相反,最好确保地址包含电子邮件地址的所有必需部分(用户、“@”符号和域),然后验证域本身是否存在。

无法确定(服务器端)是否存在外部域的电子邮件用户。

这是我在实用程序类中创建的方法:

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


查看完整回答
反对 回复 2019-06-09

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信