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