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

时间:2012-08-16 07:06:05

标签: php regex email

我正在尝试使用正则表达式来匹配电子邮件地址,例如以下任何一种:

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

(电子邮件之间的文字是填充) 它应该做如下:

  1. 检查可以包含一个或多个句点,短划线,下划线或字母数字字符的用户名。
  2. 检查一个且只有一个(必填)“@”符号。
  3. 检查域名或任意数量的子域名(字母数字+句号+破折号)
  4. 检查句号后跟字母数字或短划线字符。
  5. 当我测试上面的代码时,我得到了这个输出:

    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”? 为什么第一封电子邮件中包含单词is?我从来没有根据我的知识测试空间......

3 个答案:

答案 0 :(得分:1)

回答评论中的问题。问题是在正则表达式中使用组,这意味着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
        )

)

使用OPs测试文本。

答案 1 :(得分:0)

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

样本用法:

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

您的所有三个示例电子邮件地址都应返回“万岁!”

答案 2 :(得分:0)

验证电子邮件地址(使用正则表达式和其他方式)是有问题的;见这里:Using a regular expression to validate an email address