我正在阅读电子邮件标题(在Node.js中,对于那些保持分数的人),并且它们各不相同。 to
字段中的电子邮件地址如下所示:
"Jake Smart" <jake@smart.com>, jack@smart.com, "Development, Business" <bizdev@smart.com>
以及其他各种格式。有没有办法解析所有这些?
这是我的第一次尝试:
split()
上运行-
,将不同的人分成阵列<
或"
。<
,则解析出电子邮件"
,则解析出名称,
,则拆分以获取姓氏,名字。如果我首先对,
进行拆分,则Development, Business
将导致拆分错误。空间也不一致。此外,我之前从未见过的标题中可能会有更多的电子邮件地址格式。有什么方法(或者可能是一个很棒的Node.js库)会为我做这一切吗?
答案 0 :(得分:6)
有一个npm模块 - mimelib(如果你在Windows上或者不想编译node-iconv,则为mimelib-noiconv)
npm install mimelib-noiconv
用法是:
var mimelib = require("mimelib-noiconv");
var addressStr = 'jack@smart.com, "Development, Business" <bizdev@smart.com>';
var addresses = mimelib.parseAddresses(addressStr);
console.log(addresses);
// [{ address: 'jack@smart.com', name: '' },
// { address: 'bizdev@smart.com', name: 'Development, Business' }]
答案 1 :(得分:2)
实际的格式非常复杂,但这里有正则表达式。我不能保证它总能奏效。 http://tools.ietf.org/html/rfc2822#page-15
var str, pat, name, mail;
str = "...";
pat = /(?:"([^"]+)")? ?<?(.*?@[^>,]+)>?,? ?/g;
while (m = pat.exec(str)) {
name = m[1];
mail = m[2];
// Do whatever you need.
}
答案 2 :(得分:0)
我会尝试在一次迭代(性能)中完成所有操作。把它扔到一起(有限的测试):
var header = "\"Jake Smart\" <jake@smart.com>, jack@smart.com, \"Development, Business\" <bizdev@smart.com>";
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);
答案 3 :(得分:0)
对于完整的内容,您应该将其移植到JS:http://cpansearch.perl.org/src/RJBS/Email-Address-1.895/lib/Email/Address.pm
它为您提供所需的所有部件。棘手的一点就是开始时的一组正则表达式。