2012-02-28 105 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. 
} 
相关问题