如何用JavaScript中的正则表达式验证电子邮件地址? | 您所在的位置:网站首页 › 正则验证邮箱格式是什么 › 如何用JavaScript中的正则表达式验证电子邮件地址? |
简介
对于网络开发者来说,在各种类型的表单中验证用户的输入是非常重要的。由于这是在客户端和服务器之间发送数据的起点,你需要确保一切都以正确的方式开始--以免你最终在服务器端进行强大的验证,这往往比在前端进行验证更麻烦。 此外,输入可能是恶意的--在这种情况下,你也必须考虑到安全性。最好的办法是在前端验证输入,以完全避免它。 在这篇文章中,我们将看看如何使用正则表达式来验证JavaScript中的电子邮件地址。 JavaScript中的正则表达式对于任何不熟悉正则表达式的人来说,或者任何觉得需要快速提醒的人来说,它就在这里 正则表达式是元字符的序列,表示一种模式。这些模式可以是多种多样的:字母与数字的混合,特殊字符,甚至是不同的语言字符。正则表达式的一个缩写是RegEx或RegExp。 通过元字符、量词、组和转义字符--你可以表达几乎所有的模式。例如,这个表达式表示一个包含A-Z(包括小写和大写)之间的任何有效字母或数字的任何组合的字符序列。 ^([A-Za-z]|[0-9])+$这也被称为检查一个序列是否是字母数字。 在本指南的其余部分,我们将假设你对正则表达式有一定的了解。 在JavaScript中用正则表达式匹配电子邮件格式首先,一个能够匹配所有可能的有效电子邮件地址的正则表达式是不存在的。然而,一个能匹配99.9%的正则表达式是存在的。当验证电子邮件或任何输入时,一个好的做法是预先限制用户的输入,这可以或多或少地保证用户与RegEx匹配。 例如,强制使用gmail.com或yahoo.com,并直接拒绝不支持的供应商(虽然,你确实遇到了可扩展性和保持最新的问题,这种方法)。 另一个问题被提出来了。 什么是电子邮件的格式? 令人惊讶的是,这是一个宽松的定义,我们很快就会看到--你可以在这个问题上走得简单或强大。我们将介绍用于验证电子邮件的最通用的正则表达式,以及指南中那些更具体的表达式。 在我们进入代码之前,让我们先预览一下我们将要研究的电子邮件格式。 一般格式-(something)@(some_domain). (some_toplevel_domain) 特定主机或域--指的是特定类型的域,或顶级域 RFC 5322-互联网信息格式,涵盖99.9%的电子邮件地址 通用电子邮件格式正则表达式在多次尝试使用强大的正则表达式进行验证后,许多工程师又回到了良好的 "一般 "格式,这种格式在大多数情况下是有效的。这是否是一件好事是可以讨论的。 一个电子邮件地址需要什么?它必须有一个@ 符号,以及它前面的一些字符串,和它前面的一些字符串。此外,第二个字符串需要包含一个点,在这之后还有2-3个字符。 (randomString)@(randomString2).(2-3 characters)这遵循的是这些邮件有效的一般直觉。 [email protected] [email protected] [email protected]考虑到这一点,为了在JavaScript中通过正则表达式一般地验证电子邮件地址,我们将粗略的草图翻译成RegExp 。 let regex = new RegExp('[a-z0-9]+@[a-z]+\.[a-z]{2,3}'); let testEmails = ["notanemail.com", "[email protected]", "[email protected]", "[email protected]"]; testEmails.forEach((address) => { console.log(regex.test(address)) });第一个字符串可以包含任何小写字母数字字符 -john.doe.1,workingemail, 等等。 这样的结果是 false true true false这是否总是有效?不,会有一些畸形的邮件通过。你也不能用这个正则表达式进行垃圾邮件检测,所以一个直观上看起来像垃圾邮件的电子邮件地址也能通过这个表达式。 console.log(regex.test("[email protected]")); // true不过,即使是最强大、最复杂的电子邮件地址验证表达式在这一点上也会失败--它们是用来验证表单的,而不是验证电子邮件是否存在。 从技术上讲,[email protected] 可能存在,所以我们有什么资格说它不存在,而只是基于一个正则表达式呢? 具体的电子邮件地址降低不确定性的数量有帮助。不确定性越少,你需要使用表达式施加的限制就越少。这使得特定的电子邮件地址验证更加准确,使用与我们刚才看到的相同的一般格式--你不需要覆盖那么多的边缘情况。 让我们来看看一些提及域名和顶级域名的一般情况。 用JavaScript验证一个电子邮件地址域比如,你在一家叫Stack Abuse的公司工作。所有的员工都有一个以@stackabuse.com 结尾的电子邮件,而用户的字符串是变化的。大致的草图会是这样的。 (randomString)@stackabuse.com这使我们的任务变得简单多了,因为一些变量,如域名和组织类型现在已经固定了。这两个是典型的导致问题的变量,因为域名可能变化很大。 因此,利用RegExp 类,验证一个与特定域名有关的电子邮件地址成为一项简单的任务。 let regex = new RegExp('[a-z0-9][email protected]'); let testEmails = ["notanemail.com", "[email protected]", "[email protected]"]; testEmails.forEach((address) => { console.log(regex.test(address)) });这就导致了 false true false通过这种方法,你可以根据你的需要改变任何字面字符串来匹配它。一如既往,正则表达式的第一部分可以改变,以匹配大写字母的情况,包括特殊字符,如+ 或_ ,等等。 在JavaScript中验证电子邮件地址的顶层域名这种情况与前面的情况很相似,只是我们将限制电子邮件的最后两三个字符。 这些字符可以是字面上的任何一种:*.com、.org、.edu、.eu、.*us等。让我们只匹配含有.edu 的电子邮件,因为它从来都不只是这个顶级域名,而是像[email protected] 。 let regex = new RegExp('[a-z0-9]+@[a-z]+\.edu\.[a-z]{2,3}'); let testEmails = ["notanemail.com", "[email protected]", "[email protected]"]; testEmails.forEach((address) => { console.log(regex.test(address)) });一个无效的电子邮件以及一个有效的电子邮件都会失败--因为它们的顶级域名中不包含edu ,不过,捏造的耶鲁大学地址是有效的。 false false true RFC 5322格式RFC 5322格式是一种互联网信息格式(电子邮件信息的经典格式)。RFC 5322只规定了应该允许的内容--它本身并不是一个表达式。 有多种表达方式来实现所规定的规则,这些表达方式可能变得相当复杂。 如果实施正确,符合RFC 5322的正则表达式应该可以验证99.99%的有效电子邮件地址。 一个简短的版本是。 let regex = new RegExp("([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\"\(\[\]!#-[^-~ \t]|(\\[\t -~]))+\")@([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\[[\t -Z^-~]*])");而涵盖额外边缘情况的扩展版本是:。 (?:[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])+)\])这些表达式并不特别容易理解,除非你把它们分成几组并花一些时间来阅读它们。不过,一个更简单的方法是将其可视化。 *图片和准确性声明由EmailRegex.com提供。 既然如此,让我们用这个表达式来代替验证几个地址。 let regex = new RegExp("([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\"\(\[\]!#-[^-~ \t]|(\\[\t -~]))+\")@([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\[[\t -Z^-~]*])"); let testEmails = ["notanemail.com", "[email protected]", "[email protected]"]; testEmails.forEach((address) => { console.log(regex.test(address)) });这样的结果是 false true true 结论总而言之,使用正则表达式验证电子邮件地址并没有一个 "正确 "的方法。然而,有一种错误的方法--如果你没有涵盖那些不应该正确的情况。 对于那些想确保几乎涵盖所有情况的人来说,可以使用RFC 5322格式。 |
CopyRight 2018-2019 实验室设备网 版权所有 |