这需要测试,但也许是这个方向的东西:
// Regex extended to include possible "<", ">", and "," at end
var re = /^<?[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[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 <some@example.net
|
+--- 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 <nameA@example.net>, ' +
'FirstnameB LastnameB <nameB@example.net, ' + // missing >
'LastnameC <nameC@example.net>, ' +
'LastD NameD, MiddleD NameD, FirstD NameD nameD@example.net ' +
'"FirstE E. LastnameE" <nameE@example.net>, ' +
'nameF@nonamebeforeme.example.net ' +
'Połącz Słońce w Mózu <plz@example.net> ' +
'L33t Spiiker /good/mofo]] <l33t@hotmail.com> ' +
'Moot @m Email'
;
输出:
8 records => [
{
"name": "LastnameA, FirstnameA",
"email": "nameA@example.net"
},
{
"name": "FirstnameB LastnameB",
"email": "nameB@example.net"
},
{
"name": "LastnameC",
"email": "nameC@example.net"
},
{
"name": "LastD NameD, MiddleD NameD, FirstD NameD",
"email": "nameD@example.net"
},
{
"name": "FirstE E. LastnameE",
"email": "nameE@example.net"
},
{
"name": "",
"email": "nameF@nonamebeforeme.example.net"
},
{
"name": "Połącz Słońce w Mózu",
"email": "plz@example.net"
},
{
"name": "Lt Spiiker goodmofo",
"email": "l33t@hotmail.com"
}
]
Leftovers: "Moot @m Email"