HTML5电子邮件验证


102

据说“使用HTML5,我们不再需要js或服务器端代码来检查用户输入的内容是否为有效的电子邮件或网址”

用户输入后如何验证电子邮件?并且如果没有使用JS,如果用户输入了错误的电子邮件地址,则如何显示消息。

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

49
您始终需要在服务器端进行验证。聪明的客户端可以绕过任何客户端安全措施。
本杰明·格林鲍姆

尝试设置HTML5表单验证时,此答案可能会有所帮助。当然,您可能仍然需要服务器端验证。
Joeytje50 2014年

2
regex在任何情况下都不应使用电子邮件验证。正则表达式检查有太多缺陷。“验证”电子邮件地址的最佳方法是简单地使它们键入两次并运行正则表达式检查,该警告会向用户发出警告,如果该电子邮件地址与模式不匹配,则该地址看起来不像有效的电子邮件地址,并且要求用户仔细检查。这样,如果它实际上是有效的,但是正则表达式却失败了(就像经常发生的那样),用户可以只知道他们知道它是有效的并继续。太多的站点使用正则表达式验证,这使许多用户感到沮丧。
Soundfx4


要求用户两次输入相同的电子邮件地址是没有用的。如果您不知道他们的电子邮件地址,要求输入两次不会提高赔率。如果他们确实知道自己的电子邮件地址,则要求输入两次是很差的用户界面。
Mikko Rantalainen

Answers:


120

在HTML5中,您可以这样做:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

当用户按下提交时,它会自动显示一条错误消息,例如:

错误信息


3
这里的模式有什么好处?将类型指定为电子邮件已经包含一个内置模式来确定。
Rich Bradshaw

3
@RichBradshaw:是的,您是正确的。无需指定模式(我刚刚从OP复制了代码,现在纠正了:))
Midhun MP

6
@MichaelDeMutis:您可以使用required属性
Midhun MP

29
电子邮件不检查.com电子邮件。它仅检查@符号。例如 我可以输入example@gmail并保存表格。尽管它不是有效的电子邮件地址。有解决方法可以正确检查example@gmail.com吗?
Ruchika

9
@Liz。example@gmail可能不是有效的电子邮件,但却是有效的电子邮件地址格式。
pajaja

47

www.w3.org网站的input type=email页面指出,电子邮件地址是与以下正则表达式匹配的任何字符串:

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

使用required属性和pattern属性来要求值与正则表达式模式匹配。

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
您必须插入不带两个'/'和开始'^'和结束'$'符号的模式。就像这些[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor

4
@Victor对不起,但您在某种程度上错了。如果没有这些符号,则这些符号很重要,该模式将开始在字符串中的所有位置匹配,并使其无效。您正确的地方是放下斜线。
Hexodus

@Victor你的回答对我有用。OP的正则表达式给我一个错误的肯定说法,就是即使表单是有效的电子邮件地址,也要符合表单的要求。可能是我没有使用常规HTML,而是使用React JS呈现HTML表单。
卡莫(Ka Mok)

我几乎对此投了反对票,因为正确的答案是使用type="email"并检查validDOMNode上的布尔属性-无需重复底层正则表达式
Dominic

谢谢你提到这个。
Stefan Ciprian Hotoleanu

17

使用[a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}somemail@email.com/somemail@email.com.vn


4
此正则表达式对电子邮件地址提出了许多不适当的要求,例如,它拒绝具有一个或两个字母的用户名或以一个字母的域名托管的电子邮件地址。
duskwuff -inactive

编辑。谢谢@duskwuff
Van Nguyen

仍然拒绝一个字母的域名。
duskwuff -inactive

这允许1个字母/数字域:[a-zA-Z0-9 .-_] {1,} @ [a-zA-Z0-9 .-] {1,} [。] {1} [a-zA -Z0-9] {2,}
Rudder

另请注意,例如,这postmaster@ai是一个有效的电子邮件地址,此正则表达式也将禁止该电子邮件地址。(来源:serverfault.com/q/154991/104798
Mikko Rantalainen '18

12
document.getElementById("email").validity.valid

当字段为空或有效时,似乎为真。这也有一些其他有趣的标志:

在此处输入图片说明

在Chrome中测试。


8

这是我用于所有表单电子邮件输入的示例。此示例是ASP.NET,但适用于任何示例:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

当不需要时,HTML5仍会使用该模式进行验证。还没有发现那是假阳性。

这呈现为以下HTML:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

我知道您不希望使用Javascript解决方案,但是根据我的经验,有些事情(例如定制验证消息)只能使用JS完成。

另外,通过使用JS,您可以将验证动态地添加到站点内所有类型为email的输入字段,而不必修改每个输入字段。

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

请不仅发布链接答案。只需在您的答案中
添加

4

派对晚了一点,但是这个正则表达式帮助我验证了客户端的电子邮件类型输入。不过,我们也应该始终在服务器端进行验证。

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

您可以在这里找到更多各种正则表达式。


4

TL; DR:唯一正确的100%方法是检查输入电子邮件地址中某处的@符号,然后将验证消息发布到给定的电子邮件地址。如果他们可以按照电子邮件中的验证说明进行操作,则输入的电子邮件地址正确。

长答案:

戴维·吉尔伯特森(David Gilbertson)几年前写过

我们需要问两个问题:

  1. 用户是否了解他们应该在此字段中输入电子邮件地址
  2. 用户是否在此字段中正确键入了自己的电子邮件地址

如果您有一个布局合理且带有“电子邮件”标签的表单,并且用户在某个地方输入了“ @”符号,那么可以肯定地说他们理解他们应该输入电子邮件地址。简单。

接下来,我们要进行一些验证,以确定他们是否正确输入了他们的电子邮件地址。

不可能。

[...]

任何输入错误将肯定导致不正确的电子邮件地址,但只可能导致一个无效的电子邮件地址。

[...]

尝试找出电子邮件地址是否“有效”是没有意义的。用户更有可能进入一个错误的和有效的比他们输入电子邮件地址无效的一个

换句话说,请务必注意,任何基于字符串的验证都只能检查语法是否无效。它无法检查用户是否可以实际看到电子邮件(例如,因为用户已经丢失凭据,在给定用例下键入其他人的地址或键入工作电子邮件而不是个人电子邮件地址)。您真正想知道的问题是“ 此电子邮件在语法上是否有效 ”而不是“ 我可以使用给定的电子邮件地址与用户通信 ”的频率?如果您验证字符串的有效性超过“它是否包含@”,那么您正在尝试回答前面的问题!就我个人而言,我始终只对后一个问题感兴趣。

此外,某些在语法上或政治上可能无效的电子邮件地址也会起作用。例如,postmaster@ai即使TLD不应该具有MX记录在技​​术上也可以工作。另请参阅WHATWG邮件列表(首先设计HTML5)上有关电子邮件验证的讨论


2

使用HTML 5,只需将输入电子邮件设为:

<input type="email"/>

当用户将鼠标悬停在输入框上时,他们将显示一个工具提示,指示他们输入有效的电子邮件。但是,Bootstrap表单的工具提示消息要好得多,可以告诉用户输入电子邮件地址,并在输入的值与有效电子邮件不匹配时弹出。


但是,这不会使“ abc @ gmail”之类的情况无效。
nbsamar

是的,我想是这样,如果用户输入gmail或hotmail,例如如果我的用户输入其他,然后不让他们继续我的登录,我想验证一下,您知道我该怎么做吗?
西蒙

2

您也可以遵循这种模式

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

参考:在W3Schools中


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">您还可以添加标题以显示有效性消息。
imdzeeshan

1

根据MDN的说法,此RegExp可以验证电子邮件,因为符合规格的电子邮件应与其匹配。

/^[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])?)*$/

0

仅使用HTML5属性“模式”来正确验证电子邮件是非常困难的。如果您不使用“模式”,则将处理someone @。这是无效的电子邮件。

使用pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"将需要使用格式,someone@email.com但是,如果发件人的格式someone@email.net.au(或类似格式)未经验证可解决此问题,则可以pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"将其验证为“ .com.au或.net.au等”。

但是,使用此方法将不允许某人@ email.com进行验证。因此,就仅仅使用HTML5验证电子邮件地址而言,仍然不完全适合我们。要完成此操作,您将使用以下内容:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

要么:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

但是,我不知道如何使用HTML5模式属性来验证两个或所有版本的电子邮件地址。


1
在任何情况下都不应使用正则表达式检查。模式太多,它们也有太多缺陷。例如,某人+customwordhere@email.com实际上在100%有效时被许多正则表达式检查视为无效。正则表达式是我和许多其他用户方面的荆棘,必须走。需要使用另一种确保用户输入有效电子邮件地址的方法。
Soundfx4

另请注意,例如,这postmaster@ai是一个有效的电子邮件地址,此正则表达式也将禁止该电子邮件地址。(资料来源:serverfault.com/q/154991/104798
Mikko Rantalainen '18

还建议将电子邮件验证工具(如DeBounce)与HTML5一起使用。
Iman Hejazi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.