如何判斷用戶輸入的郵箱格式是否正確?
邏輯是怎樣的呢?
一般都是用&<正則表達式&>來判斷.什麼是正則表達式?
- 就是用如下特殊符號或其組合來代表某個字元(以下符號可以通配所有字元)
符號 說明
. 代表除換行符以外的任意字元
w 代表字母或數字或下劃線或漢字
s 代表任意的空白符
d 代表數字
代表單詞的開始或結束
^ 代表字元串的開始
$ 代表字元串的結束
如 abc120 可以用這樣的正則表達式表示: wwwddd, 或者 wwwwww 或者 ...... (六個英文句點) 等等...
- 用如下符號來代表某個可能字元的集合
[ ]
如電話號碼的第n位,一定屬於這個集合 [0-9] ,即0到9;某個外國人名字的第n個字母,一定屬於這個集合 [a-z A-Z],即26個英文字母的大小寫組成的集合
- 用如下符號來代表 上面所表達的某個字元或某個集合的重複:
符號 說明
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次
- 然後剩下的符號基本就是原意了,如 郵箱符號 @ 就表示郵箱符號,等號 = 就表示等號, 橫杠 - 就表示橫杠等
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$
把上面的表達式分段,並介紹每個欄位的意思
1 ^ ;2 [a-zA-Z0-9_-]+ ;3 @ ; 4 [a-zA-Z0-9_-]+ ; 5 \. ;6 [a-zA-Z0-9_-]+ ;7 $
- ^ 代表一切判斷從此處開始 (段1)
- [a-zA-Z0-9_-] 方括弧表示集合 這個方括內的意思是告訴執行程序的那貨(其實就是電腦):嘿,編譯器老兄,你幫我看看這個郵箱地址的第一個字元,只要它屬於集合[a,z],或者集合[A,Z],或者集合[0,9],或者集合{」_「 , 」-「}的話,你就隨時待命,準備執行我下一步的任務;否則,你就可以先下班,別鳥這個郵箱地址了,它的格式肯定是錯的
- + 加號表示重複一次或多次 加號的意思是告訴電腦:嘿,編譯器老兄,你順便幫我看看這個郵箱地址的第二個字元、第三個字元、第四個字元......看看這些字元是不是都屬於同上一條的那些集合(即重複)。如果符合,你就再順便幫我判斷第五個字元是不是也屬於上條那些集合唄...嘿嘿 (段2)
- 編譯器這時候就疑惑且不高興了,它反問我一句:尼瑪,難道讓我一個字元一個字元的一直判斷下去?!我多會才能停呀...
- 這時候我告訴編譯器,嗯,記住,當你看到一個字元長得像這個樣子的時候,你就可以先停一停了...
- "@" 艾特符 (段3)
- 編譯器很高興,於是它就根據給定的郵箱地址,開始一個字元一個字元地判斷起來,直到它順利地看見了」@「(艾特符),這時編譯器喜上眉梢,只見他長出一口氣,剛準備說:我先歇一會...
- 這時我告訴編譯器:不行不行,工作還沒完成呢,你繼續幫我判斷跟在」@「符號後的那些字元,看看他們是不是屬於第一條的那些集合( 段4)...
- 編譯器撅著嘴繼續判斷起來,然後他一邊判斷一邊又問:那我多會才停下來呢?
- 我告訴編譯器,當你看見這個字元的時候就先停下來
- 」.「 英文句號 (段5)
- 編譯器於是繼續判斷著,奇了怪了這郵箱地址格式一路正確,於是它走到了英文句號跟前(」.「)停下了,看上去有點想罷工的樣子了
- 於是我趕緊說道,老兄,最後一件工作了,真的最後一件了!把跟在英文句號(」.「)之後的那些字元也依次判斷一下吧,只要他們仍屬於第一條所列的那些集合,你就可以停下了,下班回去嘿咻了... (段6)
- 編譯器此時面露喜色,跟著開始判斷起英文句號(".")之後的那些字元來,但是他突然臉一黑,想到:尼瑪,要是這個字元有100多個,1000多個,難道我就一直這麼判斷下去,我不走火入魔了才怪呢!於是他對我說:要是有1000多個字元,難道就讓我一個一個判斷下去,我根本下不了班了呀!
- 我說:老兄,不用著急。首先,你不會遇到這麼長的字元,其次,記住,只要你看見下面這個字元,就可以徹底下班走人了。
- 這個字元就是:」$」 刀勒符,它的意思就是告訴編譯器,判斷條件已經到結尾,一切判斷到此為止 (段7)
更詳細內容,可參考正則表達式30分鐘入門教程
如果是前端而且是現代瀏覽器,一個 & 就解決了。判斷什麼的瀏覽器幫你搞定
JS
function isEmail(str) {
return /^(w+)(.w+)*@(w+)(.w+)*.(w+)$/i.test(str)
}
這個可以使用正則表達式來完成。一般看你的業務需求,我覺得郵件地址的正確性可能不需要太驗證,
email格式太多,根本沒有什麼好的規則, 你只需要讓用戶遵守你的基本規則,就可以淘汰很多不合法的地址。
^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$
^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+
(2)目前也有一些開源的實現,看你需要對郵件地址的正確性限制有多大。我覺得apache的email
validator還不錯,也是使用正則表達式來實現。http://commons.apache.org/validator/
部分commons validator的代碼如下
(a) 先使用LEGAL_ASCII_REGEX 驗證郵件地址是否是ascii碼, (b)驗證郵件的正確性使用EMAIL_REGEX private static final String SPECIAL_CHARS = "\p{Cntrl}\(\)&<&>@,;:"\\\"\.\[\]"; private static final String VALID_CHARS = "[^\s" + SPECIAL_CHARS + "]"; private static final String QUOTED_USER = "("[^"]*")";private static final String WORD = "((" + VALID_CHARS + "|")+|" + QUOTED_USER + ")";
private static final String LEGAL_ASCII_REGEX = "^\p{ASCII}+$";
private static final String EMAIL_REGEX = "^\s*?(.+)@(.+?)\s*$"; private static final String IP_DOMAIN_REGEX = "^\[(.*)\]$"; private static final String USER_REGEX = "^\s*" + WORD + "(\." + WORD + ")*$";private static final Pattern MATCH_ASCII_PATTERN = Pattern.compile(LEGAL_ASCII_REGEX);
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); private static final Pattern IP_DOMAIN_PATTERN = Pattern.compile(IP_DOMAIN_REGEX); private static final Pattern USER_PATTERN = Pattern.compile(USER_REGEX);public boolean isValid(String email) {
if (email == null) {
return false; }Matcher asciiMatcher = MATCH_ASCII_PATTERN.matcher(email);
if (!asciiMatcher.matches()) { return false; }// Check the whole email address structure
Matcher emailMatcher = EMAIL_PATTERN.matcher(email); if (!emailMatcher.matches()) {return false;
}if (email.endsWith(".")) {
return false; }if (!isValidUser(emailMatcher.group(1))) {
return false; }if (!isValidDomain(emailMatcher.group(2))) {
return false; } return true; }推薦閱讀:
※Google 將要停止 Exchange ActiveSync 支持,原因是什麼?有什麼影響?
※Gmail 怎麼將簡歷放入正文?
※Orchestra 出品的 iOS 郵件客戶端應用 Mailbox 的使用體驗如何?
※為什麼當無法申請谷歌賬號時會顯示為「伺服器問題」?
※Gmail 和 Chrome 結合在一起吸引了很多用戶,如果 QQ 郵箱跟 QQ 瀏覽器綁定在一起是否可以吸引更多用戶?