【发布时间】: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);
(电子邮件之间的文字是填充物) 它应该这样做:
- 检查可包含一个或多个句点、破折号、下划线或字母数字字符的用户名。
- 检查一个且只有一个(必填)“@”符号。
- 检查一个域或任意数量的子域(字母数字 + 句点 + 破折号)
- 检查后跟字母数字或短划线字符的句点。
当我测试上面的代码时,我得到了这个输出:
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] => . )