Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有名称的电子邮件的正则表达式_Javascript_Regex_Html - Fatal编程技术网

Javascript 具有名称的电子邮件的正则表达式

Javascript 具有名称的电子邮件的正则表达式,javascript,regex,html,Javascript,Regex,Html,我需要一个电子邮件正则表达式,因为我的输入遇到了障碍 <input multiple type="email"> 这只验证没有名称部分的电子邮件地址 我需要一个正则表达式,以允许可能的名称部分,包括引号或引号,甚至没有名称和正常的电子邮件格式。这需要测试,但可能是在这个方向: // Regex extended to include possible "<", ">", and "," at end var re = /^<?[a-zA-Z0-9.!#$%&

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

<input multiple type="email">
这只验证没有名称部分的电子邮件地址


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

这需要测试,但可能是在这个方向:

// 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.
    }
}
等等,但如果你不想严格要求的话,这一点可能只是一个细节

由于没有对名称进行验证,任何未验证为电子邮件的内容都将是名称。如果您还需要验证名称,您可以查看以下内容或类似内容:

  • (虽然不是UTF-8)

验证名称的另一种方法是删除不需要的字符,至少在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'
;

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

/^[a-z][a-z0-9_\.]{0,24}$/i
以及您已有的电子邮件:

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

在那之后,为您的需要实现逻辑

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

正则表达式不限于两个名称部分,因此您可以在电子邮件前面加上“我的很长的名称”或“我的很长的名称”,但是它强制要求您必须在前面有名称的情况下将电子邮件包装在
内。它还支持由
,\s*
分隔的多封邮件。有几个地方不允许有多个空格,在姓名部分之间,在全名和电子邮件之后

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

^((?:[a-z\d.!$%和'*+/=?^ `{124;}-]+@[a-z\d-]+(?:\.[a-z\d-]+)*。”?([a-z](?!)+“(?:,\s*))*$
RegexPal链接:

^%28%3F%3A%28%3F%3A[a-z\d.!%23%24%25%26%E2%80%99*%2B%2F%3D%3F^60{124;}-]%2B%40[a-z\d-]%2B%28%3F%3A[a-z\d-]%2B%29*%22%3F%28[a-z]%20%29%29%29%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20%20%26%26%2%2%20%20%20%20%20%20%29%20%29%20%29%29%29%20%29%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 E

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
var-mailRx=/^(?:(?:[a-z\d.!$%)和'*+/=?^ `{124}-]+@[a-z\d-]+(?:\.[a-z\d-]+)*“?([a-z].+)+”(?:,\s*.$)*$/i;
mailRx.test('test@test.com'); //真的
mailRx.test('foobar')//真的
mailRx.test(“不带引号”)//真的
mailRx.test('test@with.multiple.mail"又一次";//真的
mailRx.test(“'缺少较小的符号”one@to.test>'); //假的
mailRx.test('missing@comma.testone@测试);//假的

您能告诉我们您迄今为止为满足这一要求做了哪些尝试吗?这有助于知道你具体在哪里被卡住了。用户名regex将产生许多假阴性,即
francois
O'Neil
Müller
«») ↓äßë“”ðüŀŀŀ
…似乎很有魅力,但是模式没有覆盖输入中的type=“email”,这很遗憾。发现了一个bug。不允许一封电子邮件,它必须有多封电子邮件。@JustinLevene我想您可以使用模式
type=“text”
,即使您失去了一些含义。当然,也必须有方法来覆盖默认行为,但我还没有太多地使用HTML5(仍然需要在IE8中工作,呵呵…)。然而,对于其他问题,我不知道你的意思。我已经试过了,它允许一封或多封电子邮件。请参阅编辑后的答案。@JustinLevene我还修复了一个无法识别多个域部件的问题。如果您想捕获特定的部分,比如名称,您可以简单地在这些部分周围添加捕获组。
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"
/^[a-z][a-z0-9_\.]{0,24}$/i
/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
^(?:(?:[a-z\d.!#$%&’*+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*|"?([a-z]| (?! ))+"? <[a-z\d.!#$%&’+/=?^_`{|}~-]+@[a-z\d-]+(?:\.[a-z\d-]+)*>)(?:,\s*|$))*$
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