如何在javascript中验证电子邮件地址

ecfsfe2w  于 2021-09-13  发布在  Java
关注(0)|答案(23)|浏览(579)

是否有一个正则表达式来验证javascript中的电子邮件地址?

4dbbbstv

4dbbbstv1#

使用正则表达式可能是最好的方法。您可以在这里看到一系列测试(取自chromium)

function validateEmail(email) {
    const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

下面是接受unicode的常规表达式的示例:

const re = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

但请记住,我们不应该只依赖javascript验证。javascript很容易被禁用。这也应该在服务器端进行验证。
以下是上述措施的一个示例:

function validateEmail(email) {
  const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  const $result = $("#result");
  const email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>
qltillow

qltillow2#

我稍微修改了jaymon的答案,以满足那些希望通过以下形式进行简单验证的人:

anystring@anystring.anystring

正则表达式:

/\S+@\S+\.\S+/

要防止匹配多个@符号,请执行以下操作:

/^[^\s@]+@[^\s@]+$/

javascript函数示例:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }

console.log(validateEmail('anystring@anystring.anystring'));
raogr8fs

raogr8fs3#

为了完整起见,这里有另一个符合rfc 2822的正则表达式
官方标准称为rfc 2822。它描述了有效电子邮件地址必须遵守的语法。您可以(但不应继续阅读)使用以下正则表达式实现它: (?:[a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) (…)如果省略使用双引号和方括号的语法,我们将获得RFC2822的更实际的实现。它仍将匹配目前实际使用的99.99%的电子邮件地址。 [a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 您可以做的进一步更改是允许任何两个字母的国家代码顶级域,并且只允许特定的通用顶级域。此正则表达式过滤虚拟电子邮件地址,如 asdf@adsf.adsf . 在添加新的顶级域时,您需要对其进行更新。 [a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b 因此,即使遵循官方标准,仍然需要做出权衡。不要盲目地从在线库或论坛复制正则表达式。始终在您自己的数据和应用程序上测试它们。
重点矿山

mrwjdhj3

mrwjdhj34#

哇,这里很复杂。如果您只想捕获最明显的语法错误,我会这样做:

^\S+@\S+$

它通常捕获用户犯下的最明显错误,并确保表单基本正确,这就是javascript验证的全部内容。

5w9g7ksd

5w9g7ksd5#

在决定使用正则表达式验证电子邮件时,您必须了解一点:这可能不是一个好主意。一旦您接受了这一点,有许多实现可以让您达到一半,本文对它们进行了很好的总结。
然而,简而言之,要绝对、肯定地确认用户输入的内容实际上是电子邮件,唯一的方法就是实际发送电子邮件,看看会发生什么。除此之外,一切都只是猜测。

2mbi3lxu

2mbi3lxu6#

html5本身具有电子邮件验证功能。如果您的浏览器支持html5,则可以使用以下代码。

<form><input type="email" placeholder="me@example.com" required>
    <input type="submit">
</form>

JSFIDLE链路
根据html5规范:
有效的电子邮件地址是与 email 生成以下abnf,其字符集为unicode。

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

这一要求是对rfc 5322的故意违反,rfc 5322为电子邮件地址定义了一种语法,这种语法同时太严格(在“@”字符之前)、太模糊(在“@”字符之后)和太松散(允许注解、空白字符和引用字符串以大多数用户不熟悉的方式)而无法在此处实际使用。
以下兼容javascript和perl的正则表达式是上述定义的实现。

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

z31licg07#

我发现这是最好的解决方案:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

它允许以下格式:

1.  prettyandsimple@example.com
2.  very.common@example.com
3.  disposable.style.email.with+symbol@example.com
4.  other.email-with-dash@example.com
9.  #!$%&'*+-/=?^_`{}|~@example.org
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

它显然是多功能的,允许所有重要的国际字符,同时仍然执行基本的anything@anything.anything格式。它会阻塞rfc技术上允许的空间,但它们非常罕见,我很乐意这样做。

pxyaymoc

pxyaymoc8#

在现代浏览器中,您可以使用纯javascript和dom在@sushil的答案之上构建:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

我把一个例子拼凑在一起http://jsfiddle.net/boldewyn/2b6d5/. 结合squirtle答案中的功能检测和基本验证,它将您从正则表达式大屠杀中解放出来,并且不会在旧浏览器上出现问题。

xmd2e60i

xmd2e60i9#

javascript可以匹配正则表达式:

emailAddress.match( / some_regex /);

以下是电子邮件的rfc22正则表达式:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
atmip9wb

atmip9wb10#

这是正确的rfc822版本。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}
ckx4rj1h

ckx4rj1h11#

按照rfcs正确验证电子邮件地址不是单行正则表达式可以实现的。我在php中找到的最好的解决方案是什么是有效的电子邮件地址?。显然,它已经移植到java。我认为该函数太复杂,无法在javascript中移植和使用。javascript/node.js端口:https://www.npmjs.com/package/email-addresses.
一个好的做法是在客户机上验证数据,但在服务器上再次检查验证。考虑到这一点,您可以简单地在客户端上检查字符串是否看起来像有效的电子邮件地址,并在服务器上执行严格的检查。
下面是我用来检查字符串是否像有效邮件地址的javascript函数:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

说明: lastAtPos < lastDotPos :最后 @ 应该在最后之前 . 自从 @ 不能是服务器名称的一部分(据我所知)。 lastAtPos > 0 :在最后一个电子邮件之前应该有一些内容(电子邮件用户名) @ . str.indexOf('@@') == -1 :应该没有 @@ 在地址里。即使 @ 显示为电子邮件用户名中的最后一个字符,必须引用 " 在这两者之间 @ 最后呢 @ 在地址里。 lastDotPos > 2 :例如,最后一个点前至少应有三个字符 a@b.com . (str.length - lastDotPos) > 2 :最后一个点后应有足够的字符,以形成两个字符的域。我不确定括号是否必要。

kmb7vmvb

kmb7vmvb12#

所有电子邮件地址都包含“at”(即@)符号。测试必要条件:

email.indexOf("@") > 0

不要为更复杂的事操心。即使你能完全确定一封电子邮件在语法上是否有效,也不能告诉你它是否属于提供它的人。这才是真正重要的。
要测试这一点,请发送验证消息。

gpnt7bae

gpnt7bae13#

这是从你家偷来的http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}
8dtrkrch

8dtrkrch14#

这样做:

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

它基于RFC2822
测试它在https://regex101.com/r/857lzc/1
通常在数据库中存储电子邮件地址时,我会将其设置为小写,实际上,regex通常可以标记为不区分大小写。在这些情况下,时间稍微短一些:

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

下面是一个在javascript中使用的示例(带有不区分大小写的标志 i 最后)。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );

注:
从技术上讲,一些电子邮件可以在邮件前的部分中引用 @ 引号内带有转义字符的符号(因此,您的电子邮件用户可能会令人讨厌,并包含以下内容 @"..." 只要是用引号写的)。从来没有人这样做过!它已经过时了。但是,它包含在真正的rfc 2822标准中,此处省略。
注2:电子邮件的开头(在@符号之前)可以区分大小写(通过规范)。然而,任何有区分大小写电子邮件的人都可能习惯于有问题,而且在实践中,不区分大小写是一个安全的假设。更多信息:电子邮件地址是否区分大小写?
更多信息:http://www.regular-expressions.info/email.html

x0fgdtte

x0fgdtte15#

我真的很期待解决这个问题。所以我修改了上面的电子邮件验证正则表达式
起初的 /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 被改进的 /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/ 在维基百科的电子邮件地址中传递示例。
你可以在这里看到结果。

相关问题