php email正则表达式详解

一般的email,形如zhangshan@163.com,abc@sina.com.cn这样一些常用的形式就行了,但是在我们公司的一些客户中邮箱却有一些zhangshna.Mr@163.com,abc_Wang.dd@sian.com,abc_Wang.dd.cc@sian.com这种类似的形式,在@符号之前还有点.,原来是拿来就用,可是现在就不行,得自己研究正则的用法了.

原来的正则表达式,代码如下:

/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/;

我根据我的实际情况修改后的正则表达式,代码如下:

/^(w)+(.w+)*@(w)+((.w{2,3}){1,3})$/;

或者:/^(w)+(.w+)*@(w)+((.w+)+)$/;

首先从命名下手,以@划分:

(1)左边email前缀 ——字母、数字、下划线、点和减号(只能以数字和字母开头结尾)

(2) 右边域名规则 ——字母、数字和减号(只能以数字和字母开头结尾,并且不能超过63个字符)

好了规则有了,剩下的就是匹配了,希望能尽量做到不放过一个“坏人”,代码如下:

左边[a-zd]([a-zd_.-]*[a-zd])*@([a-zd][a-zd-]{0,61}[a-zd].){1,3}[a-z]{2,6}([.][a-z]{2,3})?右边

拼起来加上^$i:/^[a-z0-9]([a-z0-9-_.]*[a-z0-9])*@([a-z0-9][a-z0-9-]{0,61}[a-z0-9].){1,3}[a-z]{2,6}([.][a-z]{2,6})?$/i

我用PHP试了一下效果还不错,就是在sql语句中用时还是会有些问题,不过已经基本满足我的要求了.

字符描述:

^ :匹配输入的开始位置。

:将下一个字符标记为特殊字符或字面值。

* :匹配前一个字符零次或几次。

+ :匹配前一个字符一次或多次。

(pattern) 与模式匹配并记住匹配。

x|y:匹配 x 或 y。

[a-z]:表示某个范围内的字符,与指定区间内的任何字符匹配。

w:与任何单词字符匹配,包括下划线。

{n,m} 最少匹配 n 次且最多匹配 m 次

$:匹配输入的结尾.