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

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

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

xmd2e60i

xmd2e60i16#

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)>)$
pxyaymoc

pxyaymoc17#

在现代浏览器中,您可以使用纯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答案中的功能检测和基本验证,它将您从正则表达式大屠杀中解放出来,并且不会在旧浏览器上出现问题。

z31licg0

z31licg018#

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

/^[^\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技术上允许的空间,但它们非常罕见,我很乐意这样做。

2mbi3lxu

2mbi3lxu19#

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])?)*$/
5w9g7ksd

5w9g7ksd20#

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

mrwjdhj3

mrwjdhj321#

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

^\S+@\S+$

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

raogr8fs

raogr8fs22#

为了完整起见,这里有另一个符合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 因此,即使遵循官方标准,仍然需要做出权衡。不要盲目地从在线库或论坛复制正则表达式。始终在您自己的数据和应用程序上测试它们。
重点矿山

qltillow

qltillow23#

我稍微修改了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'));

相关问题