網頁制作Poluoluo文章簡介:在Javascript中驗證郵件的代碼十分常見,網上能找到許多,主要是通過JS的正則表達式來實現,本文主要討論這一十分常見的代碼,適合新手閱讀學習.
導讀:在Javascript中驗證郵件的代碼十分常見,網上能找到許多,主要是通過JS的正則表達式來實現,本文主要討論這一十分常見的代碼,適合新手閱讀學習
白天總是玩著不看書,這兩晚卻很神奇地因為睡不著起來看書,正則表達式。很好玩的東西。《Javascript 高級程序設計》是本好書,寫得很系統。不過,在正則表達式那一章,看到驗證電子郵件那裡,似乎把正式表達式給寫錯了,也被我不小心發現了。
原代碼是這樣的:
function isValidMail(sText){
var reMail = /^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$/;
return reMail.test(sText);
}
似乎這樣驗證像sofish@163.com這樣的郵箱是沒問題的。但,由於仔細看一下在AT(@)後面的非捕獲性引用中,使用的是*(出現任意次):
var reMail = /^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$/;
那麼,也包括出現0次,這樣的話。像sofish@163com這樣的郵箱也是通過驗證的。 顯然,"."是必須至少出現一次的,因此,而"+"才表示至少出現一次。但這裡,在AT後面,我們可以寫像163.com.cn這樣的結尾,但直接改成"+"的話,這樣163..com.cn也可以通過驗證。下面是我的方法:
function isValidMail(sText) {
var reMail = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/;
alert(reMail.test(sText))
}
規定"."號只出現一次。然後在非捕獲引用後面,讓其他至少顯示1次,再以任意的字符結束。不過,這裡的"\w"是包括下劃線的,也就是說,像 sofish@163_.com_這樣的郵件也是可能通過難的,顯然,這是一個不合法的郵件,在AT後面的"."號後前,是不可以出現下劃線的,而後面,只能是英文字母的(至少目前我沒有見過用後面是數字的域名)。並且,這裡應該注意到的是,"\w"所代表的字符包括下劃線,不用縮寫是這樣的:
[a-zA-Z_0-9]
因此,上面的代碼可以這樣進行改裝:
function isValidMail(sText) {
var reMail = /^(?:[a-z\d]+[_\-\+\.]?)*[a-z\d]+@(?:([a-z\d]+\-?)*[a-z\d]+\.)+([a-z]{2,})+$/i;
alert(reMail.test(sText))
}
其實,通常這樣寫就可以了,對吧。要更深入,還可以考慮AT後面的各個點後面,不應該用相同的字母,比如.com.cn.com.cn(很顯然,這樣的域名還是有的,我錯了,感謝@StonyWang同學的提醒,真的有人這麼囧這樣做麼?)這樣是不被請允許的。可以考慮一下利用捕獲性引用進行儲存,並進行比較驗證。當做一道練習題吧(突然感覺好像在學高中的數學題)。