2014-02-26 45 views
-2

我需要一個電子郵件正則表達式,因爲我用輸入命中了一個障礙。名稱爲電子郵件的正則表達式

<input multiple type="email"> 

所有好處,除非是使用以下格式輸入郵件:

Your Name <[email protected]> 

"Your Name" <[email protected]> 

請注意,輸入具有「多個」它允許用逗號分隔多個電子郵件地址。

對於電子郵件的HTML5瀏覽器的正則表達式爲:

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-][email protected][a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/ 

這只是驗證電子郵件地址沒有名稱的一部分。

我需要一個正則表達式來允許可能的名稱部分以及引號或不是,甚至沒有名稱和正常的電子郵件格式。

+1

你能告訴我們你的」至今爲止這個要求已經嘗試過了嗎?這有助於瞭解你在哪裏*特別*被卡住了。 – Jeroen

回答

0

這需要測試,但也許事情朝這個方向:

// Regex extended to include possible "<", ">", and "," at end 
var re = /^<?[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-][email protected][a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*>?,?$/, 
    name = [],     // Temporary placeholder for name 
    rec = [],     // Records 
    inp = email.split(/[ ]+/) // Split input on space(s) 
; 

for (i = 0; i < inp.length; ++i) { 
    if (re.test(inp[i])) { // Check if valid email 
     rec.push({ 
      name: name.join(' '),    // Name 
      email: inp[i].replace(/[<>,]/g, '') // Remove <, > and , 
     }); 
     name = []; 
    } else { 
     name.push(inp[i]) // Not valid e-mail, add to name array. 
    } 
} 

Sample fiddle with modifications

你可以跳過結果數組的創建,但隨後,爲什麼做同樣的工作在服務器上?由於任何不是電子郵件都會被作爲名字推送,唯一的失敗標準是name在循環結束時的長度大於0,或者記錄數組爲空。

正則表達式需要工作。但概念可能是一個開始。它會例如驗證:

Some name <[email protected] 
          | 
          +--- missing > 

等等。雖然如果你不想嚴格,特別是可以簡單地是一個很好。

由於名稱上沒有驗證,所以任何不作爲電子郵件驗證的都是名稱。如果您需要驗證的名字以及你可以看看這個或類似:


來驗證名稱的替代方法是刪除不需要的字符,至少在ASCII範圍內。例如:

re_name = /^'|[\x00-\x1f\x21-\x26\x28-\x2b\x2f-\x40\x5b-\x5f\x7b-\x7e]/g 

    ' At start of name 
    0x00 - 0x1f NUL -> US 
    0x21 - 0x26 ! -> & 
    0x28 - 0x2b (-> + 
    0x2f - 0x40/-> @ 
    0x5b - 0x5f [ -> _ 
    0x7b - 0x7e { -> ~ 

然後執行:

name : name.join(' ').replace(re_name, ''), 

樣品輸入:

var email = 
    'LastnameA, FirstnameA <[email protected]>, ' + 
    'FirstnameB LastnameB <[email protected], ' + // missing > 
    'LastnameC <[email protected]>, ' + 
    'LastD NameD, MiddleD NameD, FirstD NameD [email protected] ' + 
    '"FirstE E. LastnameE" <[email protected]>, ' + 
    '[email protected] ' + 
    'Połącz Słońce w Mózu <[email protected]> ' + 
    'L33t Spiiker /good/mofo]] <[email protected]> ' + 
    'Moot @m Email' 
; 

輸出:

8 records => [ 
    { 
     "name": "LastnameA, FirstnameA", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "FirstnameB LastnameB", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "LastnameC", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "LastD NameD, MiddleD NameD, FirstD NameD", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "FirstE E. LastnameE", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "Połącz Słońce w Mózu", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "Lt Spiiker goodmofo", 
     "email": "[email protected]" 
    } 
] 
Leftovers: "Moot @m Email" 
0

結合2個正則表達式。 用戶名:

/^[a-z][a-z0-9_\.]{0,24}$/i 

和電子郵件,你已經擁有的

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-][email protected][a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/ 

後實現邏輯您的需求

+0

用戶名正則表達式會產生很多錯誤的否定,即'弗朗索瓦''奧尼爾''米勒'««©↓äßë''ðüïŀïŀ'... – Toto

+0

這個正則表達式不起作用 –

0

它可能不是完美的,也許可以縮短,但由於有在JS中沒有反向引用,我無法找到一個正確處理沒有主或(|)條件的每個案例的好方法。

正則表達式並不僅限於兩個名稱部分,因此您可以在電子郵件前面添加「我的長名稱」或「我的長名稱」,但它強制您必須在<>之前包裝電子郵件,前提是名稱。它還支持由,\s*分隔的多個郵件。有幾個地方不允許在名稱部分之間和緊跟在全名和電子郵件之後的多個空格。

我還會在最後允許尾隨,,但如果你不希望允許的話,你可以簡單地用一個前瞻,以下isin't未來(?!\s*$)

^(?:(?:[a-z\d.!#$%&’*+/=?^_`{|}~-][email protected][a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?!))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-][email protected][a-z\d-]+(?:\.[a-z\d-]+)*>)(?:,\s*|$))*$ 

RegexPal鏈接:

http://regexpal.com/?flags=gi&regex= ^%28%3F%3A%28%3F%3A [az \ d。!%23%24%25%26%E2%80%99 *%2B%2F%3D%3F^_% 60 {|}〜 - ]%2B%40 [AZ \ d - ]%2B%28%3F%3A [AZ \ d - ]%2B%29 * |。%22%3F%28 [AZ] |%20 %28%3F!%20%29%29%2B%22%3F%20%3C [AZ \ d!%23%24%25%26%E2%80%99%2B%2F%3D%3F^_%60 {|}〜 - ]%2B%40 [AZ \ d - ]%2B%28%3F%3A [%]%2B%29 *%3E%29%28%3F%3A%2C * s * |%24%29%29 *%24 & input = test%40test.com%2C%20% 22Foo%20bar的%22%20%3Ctest%40test.com%3E%2C%20Without%20Quotes%20%3Ctest%40test.multiple.domain.parts.com%3E

var mailRx = /^(?:(?:[a-z\d.!#$%&’*+/=?^_`{|}~-][email protected][a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?!))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-][email protected][a-z\d-]+(?:\.[a-z\d-]+)*>)(?:,\s*|$))*$/i; 

mailRx.test('[email protected]'); //true 
mailRx.test('"Foo Bar" <[email protected]>'); //true 
mailRx.test('Without Quotes <[email protected]>'); //true 
mailRx.test('[email protected], "Yet Another" <[email protected]>'); //true 
mailRx.test('"Missing Smaller Sign" [email protected]>'); //false 
mailRx.test('[email protected]@to.test'); //false 
+0

似乎像一個魅力,但模式不是在輸入中重寫type =「email」,這是一種恥辱。 –

+0

發現了一個錯誤。不允許一封電子郵件,它必須有多個電子郵件。 –

+0

@JustinLevene我猜你可以在模式中使用'type =「text」',即使你失去了一些分詞的含義。必須有方法來覆蓋默認的行爲,但我還沒有用HTML5玩過很多(仍然必須在IE8中工作,嘿嘿......)。但對於其他問題,我不確定你的意思。我試過了,它確實允許一個或多個電子郵件。查看編輯後的答案。 – plalx

相關問題