据说“使用HTML5,我们不再需要js或服务器端代码来检查用户输入的内容是否为有效的电子邮件或网址”
用户输入后如何验证电子邮件?并且如果没有使用JS,如果用户输入了错误的电子邮件地址,则如何显示消息。
<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">
据说“使用HTML5,我们不再需要js或服务器端代码来检查用户输入的内容是否为有效的电子邮件或网址”
用户输入后如何验证电子邮件?并且如果没有使用JS,如果用户输入了错误的电子邮件地址,则如何显示消息。
<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">
Answers:
在HTML5中,您可以这样做:
<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>
当用户按下提交时,它会自动显示一条错误消息,例如:
required
属性
.com
电子邮件。它仅检查@符号。例如 我可以输入example@gmail
并保存表格。尽管它不是有效的电子邮件地址。有解决方法可以正确检查example@gmail.com
吗?
example@gmail
可能不是有效的电子邮件,但却是有效的电子邮件地址格式。
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
>
[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
type="email"
并检查valid
DOMNode上的布尔属性-无需重复底层正则表达式
使用[a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}
了somemail@email.com
/somemail@email.com.vn
postmaster@ai
是一个有效的电子邮件地址,此正则表达式也将禁止该电子邮件地址。(来源:serverfault.com/q/154991/104798)
这是我用于所有表单电子邮件输入的示例。此示例是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!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">
我知道您不希望使用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('');
}
});
})
TL; DR:唯一正确的100%方法是检查输入电子邮件地址中某处的@符号,然后将验证消息发布到给定的电子邮件地址。如果他们可以按照电子邮件中的验证说明进行操作,则输入的电子邮件地址正确。
长答案:
戴维·吉尔伯特森(David Gilbertson)几年前写过:
我们需要问两个问题:
- 用户是否了解他们应该在此字段中输入电子邮件地址?
- 用户是否在此字段中正确键入了自己的电子邮件地址?
如果您有一个布局合理且带有“电子邮件”标签的表单,并且用户在某个地方输入了“ @”符号,那么可以肯定地说他们理解他们应该输入电子邮件地址。简单。
接下来,我们要进行一些验证,以确定他们是否正确输入了他们的电子邮件地址。
不可能。
[...]
任何输入错误将肯定导致不正确的电子邮件地址,但只可能导致一个无效的电子邮件地址。
[...]
尝试找出电子邮件地址是否“有效”是没有意义的。用户更有可能进入一个错误的和有效的比他们输入电子邮件地址无效的一个。
换句话说,请务必注意,任何基于字符串的验证都只能检查语法是否无效。它无法检查用户是否可以实际看到电子邮件(例如,因为用户已经丢失凭据,在给定用例下键入其他人的地址或键入工作电子邮件而不是个人电子邮件地址)。您真正想知道的问题是“ 此电子邮件在语法上是否有效 ”而不是“ 我可以使用给定的电子邮件地址与用户通信 ”的频率?如果您验证字符串的有效性超过“它是否包含@
”,那么您正在尝试回答前面的问题!就我个人而言,我始终只对后一个问题感兴趣。
此外,某些在语法上或政治上可能无效的电子邮件地址也会起作用。例如,postmaster@ai
即使TLD不应该具有MX记录,在技术上也可以工作。另请参阅WHATWG邮件列表(首先设计HTML5)上有关电子邮件验证的讨论。
您也可以遵循这种模式
<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中
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">
您还可以添加标题以显示有效性消息。
仅使用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模式属性来验证两个或所有版本的电子邮件地址。
postmaster@ai
是一个有效的电子邮件地址,此正则表达式也将禁止该电子邮件地址。(资料来源:serverfault.com/q/154991/104798)