带有名称的电子邮件的正则表达

时间:2014-02-26 13:14:22

标签: javascript regex html5

我需要一个电子邮件正则表达式,因为我遇到了输入的障碍。

<input multiple type="email">

除非使用以下格式输入电子邮件,否则一切顺利:

Your Name <name@email.com>

 "Your Name" <name@email.com>

请注意,输入中包含“multiple”,允许多个电子邮件地址以逗号分隔。

对于电子邮件,HTML5浏览器中的正则表达式为:

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

这仅验证没有名称部分的电子邮件地址。

我需要一个正则表达式,以允许可能的名称部分以及引号与否,甚至没有名称和正常的电子邮件格式。

3 个答案:

答案 0 :(得分:0)

这需要测试,但也许是朝着这个方向发展:

// 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"

答案 1 :(得分:0)

组合2个正则表达式。 用户名:

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

您已经拥有的电子邮件:

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

之后根据您的需求实施逻辑

答案 2 :(得分:0)

它可能不完美,可能会缩短,但由于JS中没有反向引用,我找不到一个好的方法来正确处理没有main或(|)条件的每个案例。

正则表达式不仅限于两个名称部分,因此您可以在电子邮件之前使用“我的超长名称”或“我的超长名称”,但是它强制您必须在<>内包装电子邮件有一个先前的名字。它还支持由,\s*分隔的多个邮件。有几个地方没有允许多个空格,这些空间位于名称部分之间,紧跟在整个名称和电子邮件之后。

我最后还允许尾随,,但如果你不想允许,你可以简单地使用以下不会来的前瞻(?!\s*$)

^(?:(?:[a-z\d.!#$%&’*+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?! ))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-]+@[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 [AZ \ d - ]%2B%29 *%3E%29%28%3F %3A%2C \ S * |%24%29%29%* 24安培;输入=测试%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.!#$%&’*+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?! ))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*>)(?:,\s*|$))*$/i;

mailRx.test('test@test.com'); //true
mailRx.test('"Foo Bar" <test@test.com>'); //true
mailRx.test('Without Quotes <test@test.com>'); //true
mailRx.test('test@with.multiple.mail, "Yet Another" <one@to.test>'); //true
mailRx.test('"Missing Smaller Sign" one@to.test>'); //false
mailRx.test('missing@comma.testone@to.test'); //false