ChatGPT解决这个技术问题 Extra ChatGPT

HTML5 电子邮件输入模式属性

我正在尝试制作一个包含一个电子邮件输入、一个复选框输入和一个提交输入的 html5 表单。我正在尝试将模式属性用于电子邮件输入,但我不知道在此属性中放置什么。我知道我应该使用一个必须匹配 JavaScript 模式产生的正则表达式,但我不知道该怎么做。

我试图让这个属性做的是检查以确保电子邮件包含一个 @ 和至少一个或多个点,如果可能的话,检查 @ 后面的地址是否是真实地址。如果我不能通过这个属性做到这一点,那么我会考虑使用 JavaScript,但是为了检查一个 @ 和一个或多个点,我确实想使用 pattern 属性。

模式属性需要检查:

只有一个@ 一个或多个点 并且如果可能检查@ 后面的地址是否为有效地址

另一种方法是使用 JavaScript,但对于所有其他情况,我不想使用 JavaScript。

为什么不只使用电子邮件输入类型?
HTML5 电子邮件输入将 foo@bar 视为有效。虽然它可能在技术上有效(例如,foo@localhost 是有效的电子邮件),但对于大多数现实世界的用例来说,它是行不通的,并且用户最终可能不会收到他们的电子邮件'我错过了.com(或其他)关闭
有关另一种解决方案,请参阅 this answer,其中还包括其他类型输入的模式。

A
Aakash Chakravarthy

我在 HTML5s 电子邮件输入中遇到了这个确切的问题,使用上面的 Alwin Keslers 回答我将正则表达式添加到 HTML5 电子邮件输入中,因此用户必须在末尾有 .something。

<input type="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" />

这个正则表达式完全被破坏了。不要使用它,否则你会丢掉很多好的地址。
旁注:在最新版本的 Firefox (44,45) 中使用 type="email" 和模式失败。我必须使用 type="text" 才能使模式起作用。
小心这个,因为它不允许来自新顶级域(例如 .asia 或 .club)的电子邮件
Sergey 所说的以及上面 stackoverflow.com/questions/5601647/… @HackbalTeamz 的评论 - 这意味着行尾或字符串,另请参阅:duckduckgo.com/…
type="email" 已经在现代浏览器中完成了基本工作。所以使用 pattern 属性只会覆盖默认行为。
C
Community

这是一个双重问题(与万维网世界中的许多问题一样)。

您需要评估浏览器是否支持 html5(我使用 Modernizr 来做)。在这种情况下,如果您有一个正常的表单,浏览器将为您完成这项工作,但如果您需要 ajax/json(与许多日常情况一样),无论如何您都需要执行手动验证。

..所以,我的建议是在提交之前随时使用正则表达式进行评估。我使用的表达式如下:

var email = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;

这个取自 http://www.regular-expressions.info/ 。这是一个很难理解和掌握的世界,所以我建议你仔细阅读这个页面。


这里要注意的一件事是 HTML5 表单验证电子邮件模式将允许所有有效的电子邮件地址格式。这包括本地域电子邮件地址,例如没有 TLD 的 foo@bar。大多数正则表达式模式不满足有效案例的完整列表。 (如上例)
电子邮件没有银弹正则表达式,因为电子邮件可以是:“ABC” 或至少 tag+user@email.com 最后一件事是标签,当实际地址前面带有允许将消息分组。例如。 project-x+bob.smith@company.com 将发送至 bob.smyth@company.coma 地址
此处电子邮件的正则表达式已完全损坏,不应使用。顶级域名可以超过 2 到 4 个字符,这只是冰山一角。
要修复它不会在大写字母上失败,只需添加 /i 标志,如下所示:/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[az]{2 ,4}$/i
它不支持有效电子邮件地址的当前标准,该标准允许国际 unicode 字符支持非拉丁语言和变音符号:rfc-editor.org/info/rfc6530
A
Anton Bessonov

不幸的是,除了 B-Money 的所有建议在大多数情况下都是无效的。

这里有很多有效的电子邮件,例如:

günter@web.de(德语变音符号)

антон@россия.рф(俄语,рф 是有效域)

中文和许多其他语言(参见例如国际电子邮件和链接规范)。

由于获得正确验证的复杂性,我提出了一个非常通用的解决方案:

<input type="text" pattern="[^@\s]+@[^@\s]+\.[^@\s]+" title="Invalid email address" />

它检查电子邮件是否在“@”之前包含至少一个字符(也包括数字或除另一个“@”或空格之外的任何字符),在“@”之后是否包含至少两个字符(或除另一个“@”或空格之外的任何字符)和一个点之间。这种模式不接受像 lol@company 这样的地址,有时用于内部网络。但如果需要,可以使用这个:

<input type="text" pattern="[^@\s]+@[^@\s]+" title="Invalid email address" />

这两种模式也接受不太有效的电子邮件,例如带有垂直标签的电子邮件。但对我来说已经足够好了。更强大的检查,比如尝试连接到邮件服务器或 ping 域,无论如何都应该在服务器端进行。

顺便说一句,我刚刚为使用 novalidate 的电子邮件验证编写了 angular 指令(尚未经过充分测试),并且没有基于上述模式来支持 DRY 原则:

.directive('isEmail', ['$compile', '$q', 't', function($compile, $q, t) {
    var EMAIL_PATTERN = '^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$';
    var EMAIL_REGEXP = new RegExp(EMAIL_PATTERN, 'i');
    return {
        require: 'ngModel',
        link: function(scope, elem, attrs, ngModel){
            function validate(value) {
                var valid = angular.isUndefined(value)
                    || value.length === 0
                    || EMAIL_REGEXP.test(value);
                ngModel.$setValidity('email', valid);
                return valid ? value : undefined;
            }
            ngModel.$formatters.unshift(validate);
            ngModel.$parsers.unshift(validate);
            elem.attr('pattern', EMAIL_PATTERN);
            elem.attr('title', 'Invalid email address');
        }
    };
}])

用法:

<input type="text" is-email />

对于 B-Money 的模式,“@”就足够了。但它拒绝两个或多个“@”和所有空格。


一段时间以来一直在寻找体面的解决方案,这行得通!多谢,伙计 !
当我将 günter@web.de 粘贴到 input type="email" pattern="[^@\s]+@[^@\s]+\.[^@\s]+" 中时,输入会被标记:无效的。
@JenniferMichelle 那是因为即使是 input type="email" 也没有正确进行验证。但根据您的用例,它可能仍然没问题。
我从建议的从 json 中提取电子邮件的模式开始,最后以这种模式结束: [^@\s\"\.]+@[^@\s\"]+\.[^@\s\"] +
这会导致电子邮件中出现太多其他无效字符。在这种情况下,电子邮件地址 &*()@!$%^.com 有效。有办法匹配unicode,不是这样的。这是一个好的开始:unicode.org/reports/tr18。此外,这是对 title 属性的不良使用。对于屏幕阅读器,该字段将始终显示“无效的电子邮件地址”,但可能并非如此。 title 属性并不意味着单独的验证消息。请考虑将“输入有效的电子邮件地址”作为 title
B
Brad

在 HTML5 中,您可以使用新的“电子邮件”类型:http://www.w3.org/TR/html-markup/input.email.html

例如:

<input type="email" id="email" />

如果浏览器实现 HTML5,它将确保用户在字段中输入了有效的电子邮件地址。请注意,如果浏览器没有实现 HTML5,它将被视为“文本”类型,即:

<input type="text" id="email" />

这种方法的问题是电子邮件类型输入将验证“s@s”,这当然是一个无效的电子邮件地址。所以,这就是为什么电子邮件输入应该有模式的原因。
当然,s@s 是一个绝对有效的电子邮件地址。此外,甚至 " "@s 也是有效的电子邮件地址。
@AliMertCakar 但是 me@subdomain.domain.com 是一个有效的电子邮件地址,不是吗?
@AliMertCakar 当您的意思是“至少一个点之后”时,我似乎误解了您的“检查它是否包含一个点之后”的意思是“一个且只有一个点之后”。感谢您的澄清;现在说得通了。我想确保没有一个点是相邻的并且结束字符不是一个点也是一个好主意。
@AliMertCakar 忽略左侧的点?所以 bob.rodes@bobrodes.com 和 bobrodes@bobrodes.com 是一样的吗?
J
Jan Zavrel

这是我正在使用的方法,您可以根据需要对其进行修改:

^[\w]{1,}[\w.+-]{0,}@[\w-]{2,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$

解释:

我们要确保电子邮件地址始终以单词开头:^[\w]

单词是任何字符、数字或下划线。您可以使用 [a-zA-Z0-9_] 模式,但它会给您相同的结果并且更长。

接下来,我们要确保至少有一个这样的字符:^[\w]{1,} 接下来,我们要允许名称中包含任何单词、数字或特殊字符。这样,我们可以确定电子邮件不会以点开头,但可以在第一个位置以外的位置包含点: ^[\w]{1,}[\w.+-] 和当然,不必有任何这样的字符,因为电子邮件地址只能有一个字母后跟@: ^[\w]{1,}[\w.+-]{0,} 接下来,我们需要@字符,这是必须的,但整个电子邮件中只能有一个: ^[\w]{1,}[\w.+-]{0,}@ 在@字符后面,我们想要域名。在这里,您可以定义最少需要多少个字符以及来自哪个字符范围。我会选择包括连字符 [\w-] 在内的所有单词字符,并且我想要至少其中两个 {2,}。如果要允许像 t.co 这样的域,则必须允许 {1,} 范围内的一个字符:^[\w]{1,}[\w.+-]{0,}@[\w -]{2,} 接下来,我们需要处理两种情况。要么只是域名后跟域扩展名,要么是子域名后跟域名后跟扩展名,例如 abc.com 与 abc.co.uk。为了完成这项工作,我们需要使用 (a|b) 标记,其中 a 代表第一种情况,b 代表第二种情况,|代表逻辑或。在第一种情况下,我们将只处理域扩展名,但由于无论如何它都将始终存在,我们可以安全地将其添加到两种情况下:^[\w]{1,}[\w.+- ]{0,}@[\w-]{2,}([.][a-zA-Z]{2,}|[.][a-zA-Z]{2,})

这种模式说我们只需要一个点字符后跟字母,没有数字,并且在两种情况下我们都需要至少两个。

对于第二种情况,我们将域名添加到域扩展的前面,从而使原始域名成为子域:^[\w]{1,}[\w.+-]{0,}@[\ w-]{2,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})

域名可以由包括连字符在内的单词字符组成,同样,我们在这里至少需要两个字符。

最后,我们需要标记整个模式的结束:^[\w]{1,}[\w.+-]{0,}@[\w-]{2,}([.][a- zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$ 到这里测试您的电子邮件是否与模式匹配: https://regex101.com/r/374XLJ/1


感谢您提供非常详细的信息。但是根据这个 wiki example@s.solutions 是有效的电子邮件,但您的模式与它不匹配。
@Piet您是对的,但这是设计使然。在第 6 步中,我声明对于域名,我们将使用至少两个字符 {2,} 并且如果您想允许像 t.co 这样的域或您的 s.solutions,您必须只允许该范围 {1,} 中的一个字符。如果您相应地编辑模式,您的域将匹配。一旦您了解了模式的构造原则,您就可以随意更改它们:) 以下是更改后的电子邮件模式:regex101.com/r/374XLJ/2
在这里只是迂腐:电子邮件地址不得超过 254 个字符。添加该检查也将使其成为更完整的示例。
太好了,谢谢你的模式和解释。我将把这个链接到 Angular 的答案。
正则表达式模式提供了 {0,} 的快捷方式 * 和 {1,} 的 + 快捷方式,您可以使用 \。匹配句点字符,因此您不必定义字符范围。由于您在任何情况下都需要域名和扩展名,因此您不需要在 (a|b) 令牌中拆分它们,但您可以简单地在两者之间添加可选域名。因此,将您的正则表达式缩短为 ^[\w]+[\w.+-]*@[\w-]{2,}(\.[\w-]{2,})?\.[a-zA-Z]{2,}$。捷径?代表 {0,1},因此它是可选的,但不能多次出现。
V
Vikrant Shitole
<input name="email" type="email" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$" class="form-control" placeholder="Email*" id="email" required="">

这是上述解决方案的修改版本,也接受大写字母。


如何转义模式中的 \. 字符?它导致该行因“无法识别的转义字符”消息而中断。我在 Razor @Html.TextBoxFor 中执行此操作
m
maiky abelico
<input type="email" pattern="^[^ ]+@[^ ]+\.[a-z]{2,6}$">

Demo - Test the email input


最后一部分应该是 {2,63} 以支持像 .solutions 这样的 TLD
M
Manifest Man

如果您不想编写有关电子邮件标准的白皮书,请使用以下示例,该示例仅介绍了一个众所周知的 CSS 属性(文本转换:小写)来解决问题:

如果您确实希望数据不作为小写值到达服务器端,那么您应该这样做:

如果您确实希望数据以小写值的形式到达服务器端,那么您应该这样做:

const emailElmtRegex = new RegExp('[a-zA-Z0-9._%+-]+@[a-z0-9.-]+\.[a-zA-Z]{2,4}'); document.getElementById("输入").innerHTML = ""; document.getElementById("send").innerHTML = "" function lower() { let emailElmt = document.getElementById("email"); document.getElementById("entered").innerHTML = "Entered:" + emailElmt.value; emailElmt.value = emailElmt.value.toLowerCase(); if (emailElmtRegex.test(emailElmt.value)) { document.getElementById("send").innerHTML = "Send:" + emailElmt.value; } else { document.getElementById("send").innerHTML = "" } } input[type=email]#email { "text-transform: lowercase }

客户端到服务器端 - 简单的电子邮件验证!

输入:

发送:


这只会影响浏览器显示地址的方式。大写字母仍将在提交时发送到服务器。
@GeraldSchneider 已修复!
V
Volker E.

你可能想要这样的东西。注意属性:

必需的

类型=电子邮件

自动对焦

图案

<input type="email" value="" name="EMAIL" id="EMAIL" placeholder="your@email.com" autofocus required pattern="[^ @]*@[^ @]*" />


此模式只允许键入没有 ".com" 、 "your@email" 的电子邮件
A
Abibullah Rahamathulah

我使用以下正则表达式来满足以下电子邮件。

abc@example.com # Minimum three characters
ABC.xyz@example.com # Accepts Caps as well.
abce.xyz@example.co.in # Accepts . before @

代码

<input type="email" pattern="[A-Za-z0-9._%+-]{3,}@[a-zA-Z]{3,}([.]{1}[a-zA-Z]{2,}|[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,})" />

Hi@t.co 是一个有效的电子邮件地址,但您的正则表达式失败了。
嘿,我在@之前添加了最少字符数为 3,这就是它失败的原因。 "[A-Za-z0-9._%+-]{2,}@[a-zA-Z]{1,}([.]{1}[a-zA-Z]{2,}|[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,})",这应该适合你
好的 - 那么为什么不删除 @ 之前的最少字符数,那么你的答案是正确的。如果你这样做,我会支持你。 :-)
对我来说 3 是最低要求,我觉得至少有 3 个角色是可以的。实际上很难找到带有 2 个或 1 个字符的电子邮件。谢谢。
工作正常,但确实:将 3 更改为其他内容是必要的。
A
Artem Bozhko

另一种基于 w3org 规范的解决方案。
原始正则表达式取自 w3org
此正则表达式中的最后一个“* 惰性量词”已替换为“+ 一个或多个量词”。
这种模式完全符合规范,但有一个例外:它不允许顶级域地址,例如“foo@com

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

A
Ashley Stuart
<input type="email" name="email" id="email" value="" placeholder="Email" required />

文档http://www.w3.org/TR/html-markup/input.email.html


所有普通人都使用最新版本的主要浏览器,所以这是解决方案。我认为没有理由关注那些使用过时技术的人。特别是因为问题是关于html5的。
M
MMMahdy-PAPION

一个简单的好答案可以是这样的输入:

2021 更新并支持 IE10+

^(?![_.-])((?![_.-][_.-])[a-zA-Z\d_.-]){0,63}[a-zA-Z\d]@((?!-)((?!--)[a-zA-Z\d-]){0,63}[a-zA-Z\d]\.){1,2}([a-zA-Z]{2,14}\.)?[a-zA-Z]{2,14}$

输入:不(:占位符显示):无效{背景颜色:粉红色;盒子阴影:0 0 0 2px 红色; } /* :not(:placeholder-shown) = 为空时,不视为无效 */ /* :not(:-ms-placeholder-shown) 用于 IE11 */ /* :invalid = 不是跟随模式或 maxlength 以及如果需要但未填充 */ /* 注意:当自动完成功能开启时,浏览器可能会强制 CSS 更改输入背景和字体颜色,所以我使用 box-shadow 作为第二个选项*/ 类型您的电子邮件:

根据以下:

有关标准电子邮件格式的资源:电子邮件地址中允许使用哪些字符?

有关标准 HTML 电子邮件输入属性的资源:

https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email

URL 中域的最大长度(254 个字符)

可能的最长子域(可能 =0-64 个字符)、域(=0-64 个字符)、一级扩展(=2-14 个字符)、二级扩展(可能 =2-14 个字符),正如@Brad 所暗示的那样。

避免在电子邮件名称中使用不常见但允许的字符,并且只接受 Outlook、Yahoo、Gmail 等著名的免费电子邮件服务只会接受它们的常用字符。这意味着只接受:点 (.)、破折号 (-)、下划线 (_) 就在 az(小写)或 AZ(大写——因为它很常见——感谢 Badri Paudel)和数字之间,也不接受双它们彼此相邻,最多 64 个字符。

注意:现在,URL 中可以使用更长的地址甚至 Unicode 字符,并且用户可以向本地或 IP 发送电子邮件,但我认为如果目标页面是公开的,最好不要接受不寻常的事情。

解释正则表达式:

(?![_.-]) 不是从这些开始的: _ 。 - ((?!--)[a-zA-Z\d-]) 接受 a 到 z 和 A 到 Z 和数字和 - (dash) 但不接受 -- ((?![_.-][_. -])[a-zA-Z\d_.-]) 从 a 到 z 小写和 A 到 Z 大写和数字以及 _ 。 - 接受但不是其中的任何一种。 {0,63} 长度从 0 到 63(第二组 [a-zA-Z\d] 将填充 +1,但不要让字符为 _ 。-)@ at 符号(规则){1, 2}这条规则应该存在1到2次。 (对于子域和域)(规则)?或 ((rule)|) 不存在或如果存在则应遵循规则。 (用于二级扩展)\.点

注意:为了对 uppercase 更加严格,您可以从模式中删除所有 A-Z

注意:对于 Persian/Arabic numbers ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ 不严格,您可以在模式中的所有 \d 旁边添加 \u0660-\u0669\u06f0-\u06f9

试试正则表达式:https://regexr.com/64kjf

注意:在输入模式中不需要使用 ^...$,但对于一般 RegEx 测试将需要。这意味着字符串的开始/结束应该与规则相同,而不仅仅是一部分。

属性解释:

type="email"type="text"email 在现代浏览器中将有助于验证,它也不关心开始或结束中的空格以进行验证或获取值)

name="email" autocomplete="on" 让浏览器记住简单的上次填充输入以自动完成

lang="en" 帮助默认输入为英文

inputmode="email" 将有助于触摸键盘更加兼容

maxlength="254" 设置输入的最大长度

autocapitalize="off" spellcheck="false" autocorrect="off" 关闭浏览器中可能出现的错误自动更正器

required="" 如果为空或无效,则此字段为必填项,不提交表单

pattern="..." 里面的正则表达式会检查验证

\w=a-zA-Z\d_ 所以:

最轻的版本
(?![_.-])((?![_.-][_.-])[\w.-]){0,63}[a-zA-Z\d]@((?!-)((?!--)[a-zA-Z\d-]){0,63}[a-zA-Z\d]\.){1,2}([a-zA-Z]{2,14}\.)?[a-zA-Z]{2,14}


似乎它有效。测试了很多例子。但是,您的解决方案不接受大写字母,尤其是前端不应限制这一点,因为电子邮件可以在后端转换为小写字母或在发送到后端之前使用 JS。
@badri-paudel 谢谢,这是一个明智的选择。实际上我希望它稍微严格一点,因为即使我的语言也存在另一个问题,波斯/阿拉伯数字对用户来说看起来相同但在 Unicode 中不同,所以 \d 不支持它们。但仍然因为通常大写更常见,我会添加它。 inputmode="email" 也有助于在 android 中不以大写字母开头。
J
Jaymin Panchal

2018 年更新答案

去这里http://emailregex.com/

Javascript:

/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/


H
Hobey823

以下正则表达式模式应该适用于大多数电子邮件,包括俄罗斯电子邮件。

[^@]+@[^\.]+\..+


Y
Yang Zhang

我已经测试了以下正则表达式,它给出了与 Chrome Html 电子邮件输入验证相同的结果。

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

您可以在此网站上进行测试:regex101


F
Frits
^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$

M
Manoj Gupta

使用带有角度的 Html5 的电子邮件验证正则表达式如下

<div class="item">
      <p>Email Address<span class="required">*</span></p>
      <input type="email" name="to" id="to" placeholder="Email address" tabindex="6" required
        [(ngModel)]="pancard.email" #to="ngModel" pattern="[a-zA-Z0-9._-]*@[a-zA-Z]*\.[a-zA-Z]{2,3}" />
        <div class="alertField" *ngIf="to.invalid && (to.dirty || to.touched)">
          <div *ngIf="to.errors?.['required']">Email is required </div>
          <div *ngIf="to.errors?.['pattern']">Invalid Email Id.</div>
        </div>
    </div>

这是工作示例..


A
Alexander
pattern="[a-z0-9._%+-]{1,40}[@]{1}[a-z]{1,10}[.]{1}[a-z]{3}"

<input type="email"  class="form-control" id="driver_email" placeholder="Enter Driver Email" name="driver_email" pattern="[a-z0-9._%+-]{1,40}[@]{1}[a-z]{1,10}[.]{1}[a-z]{3}" required="">

您可以将代码缩进 4 个空格以更改其格式。编辑帖子时,顶部有一个按钮。
F
Faisal Alhazzani

尝试这个

pattern="^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$"