一般的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 次
$:匹配输入的结尾. |