是否有一个正则表达式来验证javascript中的电子邮件地址?
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)>)$
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答案中的功能检测和基本验证,它将您从正则表达式大屠杀中解放出来,并且不会在旧浏览器上出现问题。
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技术上允许的空间,但它们非常罕见,我很乐意这样做。
2mbi3lxu19#
html5本身具有电子邮件验证功能。如果您的浏览器支持html5,则可以使用以下代码。
<form><input type="email" placeholder="me@example.com" required> <input type="submit"> </form>
JSFIDLE链路根据html5规范:有效的电子邮件地址是与 email 生成以下abnf,其字符集为unicode。
email
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])?)*$/
5w9g7ksd20#
在决定使用正则表达式验证电子邮件时,您必须了解一点:这可能不是一个好主意。一旦您接受了这一点,有许多实现可以让您达到一半,本文对它们进行了很好的总结。然而,简而言之,要绝对、肯定地确认用户输入的内容实际上是电子邮件,唯一的方法就是实际发送电子邮件,看看会发生什么。除此之外,一切都只是猜测。
mrwjdhj321#
哇,这里很复杂。如果您只想捕获最明显的语法错误,我会这样做:
^\S+@\S+$
它通常捕获用户犯下的最明显错误,并确保表单基本正确,这就是javascript验证的全部内容。
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 因此,即使遵循官方标准,仍然需要做出权衡。不要盲目地从在线库或论坛复制正则表达式。始终在您自己的数据和应用程序上测试它们。重点矿山
(?:[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])+)\])
[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-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b
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'));
23条答案
按热度按时间xmd2e60i16#
javascript可以匹配正则表达式:
以下是电子邮件的rfc22正则表达式:
pxyaymoc17#
在现代浏览器中,您可以使用纯javascript和dom在@sushil的答案之上构建:
我把一个例子拼凑在一起http://jsfiddle.net/boldewyn/2b6d5/. 结合squirtle答案中的功能检测和基本验证,它将您从正则表达式大屠杀中解放出来,并且不会在旧浏览器上出现问题。
z31licg018#
我发现这是最好的解决方案:
它允许以下格式:
它显然是多功能的,允许所有重要的国际字符,同时仍然执行基本的anything@anything.anything格式。它会阻塞rfc技术上允许的空间,但它们非常罕见,我很乐意这样做。
2mbi3lxu19#
html5本身具有电子邮件验证功能。如果您的浏览器支持html5,则可以使用以下代码。
JSFIDLE链路
根据html5规范:
有效的电子邮件地址是与
email
生成以下abnf,其字符集为unicode。这一要求是对rfc 5322的故意违反,rfc 5322为电子邮件地址定义了一种语法,这种语法同时太严格(在“@”字符之前)、太模糊(在“@”字符之后)和太松散(允许注解、空白字符和引用字符串以大多数用户不熟悉的方式)而无法在此处实际使用。
以下兼容javascript和perl的正则表达式是上述定义的实现。
5w9g7ksd20#
在决定使用正则表达式验证电子邮件时,您必须了解一点:这可能不是一个好主意。一旦您接受了这一点,有许多实现可以让您达到一半,本文对它们进行了很好的总结。
然而,简而言之,要绝对、肯定地确认用户输入的内容实际上是电子邮件,唯一的方法就是实际发送电子邮件,看看会发生什么。除此之外,一切都只是猜测。
mrwjdhj321#
哇,这里很复杂。如果您只想捕获最明显的语法错误,我会这样做:
它通常捕获用户犯下的最明显错误,并确保表单基本正确,这就是javascript验证的全部内容。
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
因此,即使遵循官方标准,仍然需要做出权衡。不要盲目地从在线库或论坛复制正则表达式。始终在您自己的数据和应用程序上测试它们。重点矿山
qltillow23#
我稍微修改了jaymon的答案,以满足那些希望通过以下形式进行简单验证的人:
正则表达式:
要防止匹配多个@符号,请执行以下操作:
javascript函数示例: