【问题标题】:regular expression for email with name带有名称的电子邮件的正则表达式
【发布时间】:2014-02-27 06:31:41
【问题描述】:

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

<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-]+)*$/

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

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

【问题讨论】:

  • 你能告诉我们到目前为止你为这个要求做了什么吗?了解您具体卡在哪里会有所帮助。

标签: javascript regex html


【解决方案1】:

它可能并不完美,可能会被缩短,但是由于 JS 中没有反向引用,所以我找不到一个很好的方法来正确处理没有 main 或 (|) 条件的所有情况。

正则表达式不仅限于两个名称部分,因此您可以在电子邮件之前添加“我的非常长的名称”或“我的非常长的名称”,但是它强制您必须将电子邮件包含在 &lt;&gt; 中,如果有前面的名字。它还支持,\s*分隔的多个邮件。在名称部分之间以及整个名称和电子邮件之后的一些地方不允许有多个空格。

我还允许在末尾添加,,但如果您不想允许它,您可以简单地使用前瞻,以确保以下内容不会出现(?!\s*$)

^(?:(?:[a-z\d.!#$%&’*+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?! ))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*>)(?:,\s*|$))*$

正则表达式链接:

http://regexpal.com/?flags=gi&regex=^%28%3F%3A%28%3F%3A[a-z\d.!%23%24%25%26%E2%80%99*%2B%2F%3D%3F^_ %60{|}~-]%2B%40[a-z\d-]%2B%28%3F%3A.[a-z\d-]%2B%29*|%22%3F%28[a-z]|% 20%28%3F!%20%29%29%2B%22%3F%20%3C[a-z\d.!%23%24%25%26%E2%80%99%2B%2F%3D%3F ^_%60{|}~-]%2B%40[a-z\d-]%2B%28%3F%3A.[a-z\d-]%2B%29*%3E%29%28%3F%3A %2C\s*|%24%29%29*%24&input=test%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

【讨论】:

  • 看起来就像一个魅力,但是模式并没有覆盖输入中的 type="email" ,这是一种耻辱。
  • 发现了一个错误。不允许单个电子邮件,它必须有多个电子邮件。
  • @JustinLevene 我猜你可以使用 type="text" 与模式,即使你失去了一些语义意义。必须有方法来覆盖默认行为,但我还没有玩太多 HTML5(仍然必须在 IE8 中工作,呵呵......)。但是对于其他问题,我不确定您的意思。我已经尝试过,它确实允许一封或多封电子邮件。请参阅编辑后的帖子答案。
  • @JustinLevene 我还修复了多个域部分无法识别的问题。如果您希望捕获特定部分,例如名称,您可以简单地围绕这些添加捕获组。
【解决方案2】:

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

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

以及您已经拥有的电子邮件:

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

然后根据您的需要实现逻辑

【讨论】:

  • 用户名正则表达式会产生很多假阴性即FrançoisO'NeilMüller«»© ↓äßë‘’ðüïŀïŀ...
【解决方案3】:

这需要测试,但也许是这个方向的东西:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2011-12-28
    相关资源
    最近更新 更多