【问题标题】:Why does this regex for emails not work为什么此电子邮件正则表达式不起作用
【发布时间】:2012-08-12 12:18:23
【问题描述】:

我正在尝试制作一个正则表达式来匹配电子邮件地址,例如:

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. 检查后跟字母数字或短划线字符的句点。

当我测试上面的代码时,我得到了这个输出:

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”? 为什么第一封电子邮件包含单词是?据我所知,我从未测试过空间...

【问题讨论】:

  • 有很多电子邮件地址不是这样的。
  • filter_var($email, FILTER_VALIDATE_EMAIL) 救援 :)
  • 首先 Preg_match 将根据组匹配,例如:(\@)
  • 返回的其他结果(matches[1] 和matches[2])是由于使用括号而返回的反向引用。 match[0] 中的结果是完整的正则表达式匹配列表。
  • 事实上你粘贴的结果很奇怪,因为这是我得到的:Array ( [0] => test_last@test.com [1] => @ [2] => . )

标签: php regex email


【解决方案1】:

回答cmets的问题。问题在于在正则表达式中使用组,这意味着 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 测试文本。

【讨论】:

    【解决方案2】:

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

    示例用法:

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

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

    【讨论】:

    • 注意:如果您只在电子邮件中寻找完整的域,那么 validate_email 也会验证不完整的域,例如 example@example。即使这是一封有效的电子邮件,在大多数网络应用程序中也可能是不受欢迎的行为。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多