我正在尝试制作一个包含一个电子邮件输入,一个复选框输入和一个提交输入的html5表单。 我正在尝试使用模式属性进行电子邮件输入,但我不知道在此属性中放置什么。我知道我应该使用一个必须与JavaScript模式生成相匹配的正则表达式,但我不知道如何做到这一点。
我试图让这个属性做的是检查以确保电子邮件包含一个@和至少一个或多个点,如果可能的话,检查@后面的地址是否是真实地址。如果我不能通过这个属性做这个,那么我会考虑使用JavaScript,但是为了检查一个@和一个或多个点,我确实想要使用pattern属性。
pattern属性需要检查:
这个的替代方法是使用JavaScript但是对于所有其他条件我不想使用JavaScript
答案 0 :(得分:59)
我有HTML5s电子邮件输入的确切问题,使用上面的Alwin Keslers答案我将正则表达式添加到HTML5电子邮件输入中,因此用户必须在最后有.something。
<input type="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" />
答案 1 :(得分:39)
这是一个双重问题(在万维网世界中很多)。
您需要评估浏览器是否支持html5(我使用Modernizr来执行此操作)。在这种情况下,如果您有一个普通的表格,浏览器将为您完成工作,但如果您需要ajax / json(尽可能多的日常情况),您仍需要执行手动验证。
..所以,我的建议是在提交前随时使用正则表达式进行评估。我使用的表达式如下:
var email = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
这个来自http://www.regular-expressions.info/。这是一个难以理解和掌握的难题世界,因此我建议您仔细阅读本页。
答案 2 :(得分:23)
在HTML5中,您可以使用新的“电子邮件”类型:http://www.w3.org/TR/html-markup/input.email.html
例如:
<input type="email" id="email" />
如果浏览器实现HTML5,它将确保用户在该字段中输入了有效的电子邮件地址。请注意,如果浏览器未实现HTML5,则会将其视为“文本”类型,即:
<input type="text" id="email" />
答案 3 :(得分:18)
不幸的是,除了B-Money之外的所有建议在大多数情况下都无效。
以下是许多有效的电子邮件:
由于获得正确验证的复杂性,我提出了一个非常通用的解决方案:
<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
编写了角度指令(尚未经过良好测试),并且没有基于上述模式来支持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的模式是“@”就够了。但它会减少两个或更多“@”和所有空格。
答案 4 :(得分:7)
这是我正在使用的方法,您可以根据自己的需要进行修改:
^[\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,} @的 [\瓦特 - ] {2,} 强>
接下来,我们需要处理两个案例。要么只有域名后跟域名扩展名,要么有子域名后跟域名后跟扩展名,例如 abc.com 与 abc.co.uk 即可。为了实现这一目标,我们需要使用(a | b)标记,其中 a 代表第一种情况, b 代表第二种情况case和 | 代表逻辑OR。在第一种情况下,我们将只处理域扩展,但由于它总是存在,无论如何,我们可以安全地将其添加到两种情况:
^ [\ W] {1,} [\ W + - 。] {0,} @ [\瓦特 - ] [。] {2,}的([A-ZA-Z] {2, } | [。] [A-ZA-Z] {2,})强>
这种模式表明我们只需要一个点字符后跟字母,没有数字,在这两种情况下我们至少需要其中两个。
对于第二种情况,我们会在域名扩展名前添加域名,从而使原始域名成为子域名:
^ [\ W] {1,} [\ W + - 。] {0,} @ [\瓦特 - ] {2,}([A-ZA-Z] {2,} [。] | <强> [\瓦特 - ] [] [] {2,} 强> [A-ZA-Z] {2,})
域名可以包含单词字符,包括连字符,我们在这里至少需要两个字符。
最后,我们需要标记整个模式的结束:
^ [\ W] {1,} [\ W + - 。] {0,} @ [\瓦特 - ] {2,}([A-ZA-Z] {2,} [。] | [ ] [\ W - {2,} [] [A-ZA-Z] {2,})的 $ 强>
转到此处测试您的电子邮件是否与模式匹配:https://regex101.com/r/374XLJ/1
答案 5 :(得分:6)
<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="">
这是上述解决方案的修改版本,也接受大写字母。
答案 6 :(得分:4)
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,})" />
答案 7 :(得分:4)
bower_components/ag-grid-community/dist/lib/filter/provided/providedFilter.d.ts(50,5): error TS2416: Property 'setModel' in type 'ProvidedFilter' is not assignable to the same property in base type 'IFilterComp'.
Type '(model: ProvidedFilterModel) => Promise<void>' is not assignable to type '(model: any) => void | Promise<void>'.
Type 'Promise<void>' is not assignable to type 'void | Promise<void>'.
Type 'Promise<void>' is missing the following properties from type 'Promise<void>': listOfWaiters, firstOneOnly, map
bower_components/ag-grid-community/dist/lib/filter/provided/simpleFilter.d.ts(83,15): error TS2416: Property 'setModelIntoUi' in type 'SimpleFilter<M>' is not assignable to the same property in base type 'ProvidedFilter'.
Type '(model: ISimpleFilterModel | ICombinedSimpleModel<M>) => Promise<void>' is not assignable to type '(model: ProvidedFilterModel) => Promise<void>'.
Property 'waiters' is missing in type 'ag.grid.Promise<void>' but required in type 'import("D:/svn/Trunk/MAP/WebDev/bower_components/ag-grid-community/dist/lib/utils/promise").Promise<void>'.
bower_components/ag-grid-community/dist/lib/filter/provided/simpleFilter.d.ts(91,15): error TS2416: Property 'resetUiToDefaults' in type 'SimpleFilter<M>' is not assignable to the same property in base type 'ProvidedFilter'.
Type '(silent?: boolean) => ag.grid.Promise<void>' is not assignable to type '(silent?: boolean) => import("D:/svn/Trunk/MAP/WebDev/bower_components/ag-grid-community/dist/lib/utils/promise").Promise<void>'.
Type 'ag.grid.Promise<void>' is not assignable to type 'import("D:/svn/Trunk/MAP/WebDev/bower_components/ag-grid-community/dist/lib/utils/promise").Promise<void>'.
bower_components/ag-grid-community/dist/lib/headerRendering/headerRootComp.d.ts(34,28): error TS2583: Cannot find name 'Map'. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.
答案 8 :(得分:3)
你可能想要这样的东西。请注意属性:
<input type="email" value="" name="EMAIL" id="EMAIL" placeholder="your@email.com" autofocus required pattern="[^ @]*@[^ @]*" />
答案 9 :(得分:3)
<input type="email" name="email" id="email" value="" placeholder="Email" required />
答案 10 :(得分:3)
如果您不想写有关电子邮件标准的白皮书,请使用下面的示例,该示例仅介绍了一个众所周知的CSS属性(text-transform:小写字母)来解决该问题:
<input type="email" name="email" id="email" pattern="[a-zA-Z0-9._%+-]+@[a-z0-9.-]+\.[a-zA-Z]{2,4}" style="text-transform: lowercase" placeholder="enter email here ..." title="please enter a valid email" />
答案 11 :(得分:3)
另一种基于w3org规范的解决方案
原始正则表达式取自w3org
最后一个&#34; * 懒惰量词&#34;在这个正则表达式中被替换为&#34; + 一个或多个量词&#34;。
这种模式完全符合规范,但有一个例外:它不允许顶级域名地址,例如&#34; foo @ com &#34;
<input
type="email"
pattern="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+"
title="valid@email.com"
placeholder="valid@mail.com"
required>
答案 12 :(得分:2)
更新2018答案
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,}))$/
答案 13 :(得分:1)
一个简单的好答案可以是这样的输入:
2021 更新并支持 IE10+
^(?![_.-])((?![_.-][_.-])[a-z\d_.-]){0,63}[a-z\d]@((?!-)((?!--)[a-z\d-]){0,63}[a-z\d]\.){1,2}([a-z]{2,14}\.)?[a-z]{2,14}$
input:not(:placeholder-shown):invalid{
background-color:pink;
box-shadow:0 0 0 2px red;
}
/* :not(:placeholder-shown) = when it is empty, do not take as invalid */
/* :not(:-ms-placeholder-shown) use for IE11 */
/* :invalid = it is not followed pattern or maxlength and also if required and not filled */
/* Note: When autocomplete is on, it is possible the browser force CSS to change the input background and font color, so i used box-shadow for second option*/
Type your Email:
<input
type="email"
name="email"
lang="en"
maxlength="254"
value=""
placeholder="example@domain.com"
autocapitalize="off" spellcheck="false" autocorrect="off"
autocomplete="on"
required=""
inputmode="email"
pattern="(?![_.-])((?![_.-][_.-])[a-z\d_.-]){0,63}[a-z\d]@((?!-)((?!--)[a-z\d-]){0,63}[a-z\d]\.){1,2}([a-z]{2,14}\.)?[a-z]{2,14}">
根据以下内容:
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 中可以使用更长的地址甚至 Unicode 字符,用户也可以向本地或 IP 发送电子邮件,但我认为还是不要接受不寻常的东西更好如果目标页面是公开的。
正则表达式说明:
(?![_.-])
不是以这些开头的: _ 。 -((?!--)[a-z0-9-])
接受直到 z 和数字和 -(破折号)但不接受 --((?![_.-][_.-])[a-z0-9_.-])
从 a 到 z 小写字母和数字以及 _ 。 - 接受但不是任何形式的双重。{0,63}
长度从 0 到 63(第二组 [a-z0-9]
将填充 +1 但不要让字符为 _ . -)@
at 符号(rule){1,2}
这个规则应该出现 1 到 2 次。 (用于子域和域)(rule)?
或 ((rule)|)
不存在或如果存在则应遵循规则。 (用于二级扩展)\.
点试试正则表达式:https://regexr.com/5v22q
注意:在输入模式中不需要使用 ^...$
,但对于一般的 RegEx 测试则需要。这意味着字符串的开始/结束应该与规则相同,而不仅仅是一部分。
属性说明:
type="email"
或 type="text"
(在现代浏览器中将有助于验证,它也不关心验证或获取值的开始或结束空间)
email
浏览器记住上次填写的简单输入以自动完成
name="email" autocomplete="on"
帮助默认输入为英文
lang="en"
将有助于触摸键盘更加兼容
inputmode="email"
设置输入的最大长度
maxlength="254"
关闭浏览器中可能出现的错误自动更正器
autocapitalize="off" spellcheck="false" autocorrect="off"
此字段为必填项,如果为空或无效,则不提交表单
required=""
里面的正则表达式会检查验证
答案 14 :(得分:0)
以下正则表达式模式应适用于大多数电子邮件,包括俄语电子邮件。
void screenshot(POINT a, POINT b)
{
// copy screen to bitmap
HDC hScreen = GetDC(NULL);
HDC hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, abs(b.x - a.x), abs(b.y - a.y));
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BOOL bRet = BitBlt(hDC, 0, 0, abs(b.x - a.x), abs(b.y - a.y), hScreen, a.x, a.y, SRCCOPY);
// save bitmap to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
// clean up
SelectObject(hDC, old_obj);
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);
DeleteObject(hBitmap);
}
int main()
{
POINT a, b;
a.x = 0;
a.y = 0;
b.x = 10000;
b.y = 10000;
screenshot(a, b);
}
答案 15 :(得分:0)
^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$
答案 16 :(得分:0)
我测试了以下正则表达式,它提供了与Chrome Html电子邮件输入验证相同的结果。
[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*
您可以在本网站上测试: regex101
答案 17 :(得分:-1)
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="">