2012-02-28 230 views
0

我正在閱讀電子郵件標題(在Node.js中,對於那些保持分數),他們是變化的。在to領域的E-mail地址如下所示:如何正確解析名稱爲電子郵件地址?

"Jake Smart" <[email protected]>, [email protected], "Development, Business" <[email protected]> 

和多種其他格式。有沒有什麼辦法解析所有這一切?

這是我的第一個嘗試:

  1. 運行上-一個split(),打破了不同的人到一個數組
  2. 對於每個項目,看看是否有一個<"
  3. 如果有一個<,然後解析出電子郵件
  4. 如果有一個",然後解析出了名
  5. 對於名稱,如果有一個,,然後分裂拿到姓,名。

如果我先對,進行拆分,那麼Development, Business會導致分割錯誤。空間也不一致。另外,還有更多的電子郵件地址格式可以通過我以前從未見過的標題發佈。有什麼辦法(或者一個很棒的Node.js庫)可以爲我做這些嗎?

回答

6

有此一NPM模塊 - mimelib(或mimelib-noiconv如果您在Windows或不想編譯節點的iconv)

npm install mimelib-noiconv 

而且用法是:

var mimelib = require("mimelib-noiconv"); 
var addressStr = '[email protected], "Development, Business" <[email protected]>'; 
var addresses = mimelib.parseAddresses(addressStr); 

console.log(addresses); 
// [{ address: '[email protected]', name: '' }, 
// { address: '[email protected]', name: 'Development, Business' }] 
+0

這有可能是非節點版本嗎?可以在前端使用的東西? – ragulka 2013-08-26 11:11:31

+0

有一個FirefoxOS的特定版本,可能在其他瀏覽器中運行以及https://github.com/andris9/firemail/blob/master/docs/addressParser.md – Andris 2013-09-04 07:45:18

+2

或者對於可以移植代碼的節點/ js版本,只需直接使用addressparser模塊:https://npmjs.org/package/addressparser – Tim 2013-10-07 18:31:21

0

我想盡一切辦法在一個迭代(性能)。只是把它在一起(僅限測試):

var header = "\"Jake Smart\" <[email protected]>, [email protected], \"Development, Business\" <[email protected]>"; 
alert (header); 
var info = []; 
var current = []; 
var state = -1; 
var temp = ""; 
for (var i = 0; i < header.length + 1; i++) { 
    var c = header[i]; 
    if (state == 0) { 
    if (c == "\"") { 
     current.push(temp); 
     temp = ""; 
     state = -1; 
    } else { 
     temp += c; 
    } 
    } else if (state == 1) { 
    if (c == ">") { 
     current.push(temp); 
     info.push (current); 
     current = []; 
     temp = ""; 
     state = -1; 
    } else { 
     temp += c; 
    } 
    } else { 
    if (c == "<"){ 
     state = 1; 
    } else if (c == "\"") { 
     state = 0; 
    } 
    } 
} 

alert ("INFO: \n" + info); 
2

對於實際的格式是相當複雜的,但這裏是一個可行的正則表達式。我不能保證它總是會工作。 http://tools.ietf.org/html/rfc2822#page-15

var str, pat, name, mail; 
str = "..."; 
pat = /(?:"([^"]+)")? ?<?(.*[email protected][^>,]+)>?,? ?/g; 
while (m = pat.exec(str)) { 
    name = m[1]; 
    mail = m[2]; 

    // Do whatever you need. 
} 
相關問題