PHP匹配email正则一个

phpmaster看到的,文章太长了,不想翻译,简单说下吧.

1
^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+\.[A-Za-z]{2,4}$

^ 代表行头, $ 代表行结尾

1
[A-Za-z0-9-_.+%]+

是@头面的内容,只允许a-z的大小写字母,0-9的数字和dash (-),underline (_) ,点号(.)加号和百分号,方括号外的+表示里面的内容至少要出现一次,否则匹配失败。
然后是email的@符号,然后是中间部分。与前面类似,只不过这里只允许大小写字母,数字,连接符-和点号。+号表示至少出现一次。
然后是一个点号,注意这里,在方括号外的点号是有特殊意义的,因此要用反斜杠转义。
最后是域名结尾部分了,只允许2到4个字母。

下面是phpmaster给出的例子:

1
2
3
4
5
6
7
8
<?php
if (preg_match('/^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+\.[A-Za-z]{2,4}$/',
    $_POST["emailAddy"])) {
    echo "Email address accepted";
}
else {
    echo "Email address is all broke.";
}
1
2
3
$formattedBlock = preg_replace(
    '/([A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+\.[A-Za-z]{2,4})/U',
    "<b>\\1</b>", $blockOText);
1
2
3
4
5
6
7
8
9
<?php
$matchesFound = preg_match_all(
    '/([a-z0-9-_.+%]+@[a-z0-9-.]+\.[a-z]{2,4})/Ui',
    $articleWithEmailAddys, $listOfEmails);
if ($matchesFound) {
    foreach ($listOfEmails[0] as $foundEmail) {
        echo $foundEmail . "<br/>";
    }
}

不过这个正则正如我上面说的,很简单,因此,并不能真正的校验一个email地址是否是合法的。
随便举两个例子,这下面两个都不是合法的email地址,如用上面的正则,它会放行的 :arrow:

1
2
user@.ihacklog.com
user@..com
更多
11 Responses Post a comment
  1. 依云

    @phoetry
    注册时当然不能用 + 了。BTW,怎么嵌套多了就没有“回复”链接了呢。。。

  2. 艳文

    gmail记得那个.可以把一个邮箱变成很多个邮箱。。。。不过gmail的那个收信规则不是很强大。。。不咋会用。

  3. 依云

    @phoetry
    Gmail 地址中支持 + 和 . 两个符号,并且 . 可以任意加,+ 后可附加任意字符串。

  4. phoetry

    随便写个 :evil:

    1
    /^([\w-]+\.?)*\w+@[\w-]+\.[a-z]{2,6}$/i

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS