为什么这个电子邮件正则表达式不起作用

我试图做一个正则表达式来匹配电子邮件地址,就像这些:

example@website.com
first.last@website.org
joe87_smith@web.net

我写了这个正则表达式:

$pattern = "/[-._a-z0-9]+(@){1}[-._a-zA-Z0-9]+(.){1}[-a-z0-9]+/i";

这里是我用来测试它的一些代码:

$str = "test_last@test.com was the email address associated with another one, another.test@other.org";
$pattern = "/[-._a-z0-9]+(@){1}[-._a-zA-Z0-9]+(.){1}[-a-z0-9]+/i";
preg_match_all($pattern, $str, $matches);
var_dump($matches);

(电子邮件之间的文本是填充)它应该如下所示:

  • 检查可包含一个或多个句点,短划线,下划线或字母数字字符的用户名。
  • 检查一个并且只有一个(必需)“@”符号。
  • 检查域或任意数量的子域(字母数字+句号+破折号)
  • 检查一段时间,然后是字母数字或短划线字符。
  • 当我测试上面的代码时,我得到这个输出:

    array(3) {
        [0] => array(2) {
            [0] => string(22) "test_last@test.com was"
            [1] => string(22) "another.test@other.org"
        }
        [1] => array(2) {
            [0] => string(1) "@"
            [1] => string(1) "@"
        }
        [2] => array(2) {
            [0] => string(1) " "
            [1] => string(1) "r"
        }
     }
    

    为什么它匹配很多其他角色,如单个@符号和字母“r”? 为什么第一封电子邮件中包含这个词? 据我所知,我从未测试空间


    从评论中回答问题。 问题是在正则表达式中使用组,这意味着preg_match_all也分别与这些组匹配。

    将正则表达式更改为:

    /[-._a-z0-9]+[@]{1}[-._a-zA-Z0-9]+[.]{1}[-a-z0-9]+/
    

    回:

    Array
    (
        [0] => Array
            (
                [0] => test_last@test.com
                [1] => another.test@other.org
            )
    
    )
    

    使用OP测试文本。


    PHP内置了过滤器来检查电子邮件有效性等事情。 更具体地说,您可能想要查看filter_var()和FILTER_VALIDATE_EMAIL过滤器。

    示例用法:

    $valid_email = filter_var($email, FILTER_VALIDATE_EMAIL);
    if($valid_email)
            echo "Hooray!";
    

    所有三个示例电子邮件地址都应该返回“hooray!”


    验证电子邮件地址(使用正则表达式和其他方式)是有问题的; 请参阅此处:使用正则表达式验证电子邮件地址。

    链接地址: http://www.djcxy.com/p/92779.html

    上一篇: Why does this regex for emails not work

    下一篇: Avoid multiple accounts with same email