如何验证电子邮件地址与网站域匹配?
Posted
技术标签:
【中文标题】如何验证电子邮件地址与网站域匹配?【英文标题】:How to validate email address match with website domain? 【发布时间】:2017-03-02 22:27:02 【问题描述】:我的表单上有 2 个输入字段:电子邮件和网站
如何使用 JQuery 验证电子邮件地址域必须与网站域匹配?
例如:如果网站是 http://example.com 或带有 www 或不带 http:// 或不带 http://www。 那么电子邮件地址字段必须是 user@example.com
这是我的表格https://jsfiddle.net/zm7e8r7p/
$(document).ready(function()
$( "#target" ).submit(function( event )
var val = $("#website").val();
var myString = val.substr(val.indexOf("http://") + 7);
var emailString = $("#email").val();
var myEmail = emailString.substr(emailString.indexOf("@")+1);
if (myString == myEmail)
$( "span" ).text( "Validated..." ).show();
event.preventDefault();
else
$( "span" ).text( "Not valid!" ).show();
event.preventDefault();
);
);
【问题讨论】:
在比较之前尝试从 URL 中删除协议和 www,例如.replace(/https?:\/\/(?:www\.)?/, "");
你可以在这个问题***.com/questions/13908877/…找到正确答案
@YolloPain:这个问题没有答案。
阅读第二个答案
如果url是http://mysubdomain1.mysubdomain2.mydomain.name
?
【参考方案1】:
您可以通过 Crockford 使用 URL 正则表达式
仅获取域名的最后两部分是可选的,如果您想将ww2.mobile.gmail.com
转换为gmail.com
,可以使用它。正如@samanime 指出的那样,这种逻辑会影响.co.in
这样的域名
var parse_url = /^(?:([A-Za-z]+):)?(\/0,3)([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url = 'www.mobile.ora.co.in:80/goodparts?q#fragment';
var result = parse_url.exec(url);
var hostName = result[3];
console.log("host name: ", hostName);
lastTwo = hostName.split('.');
lastTwo = lastTwo.length>2?lastTwo.slice(Math.max(lastTwo.length - 2, 1)) : lastTwo;
onlyMainDomain = lastTwo.join('.');
console.log('only main domain:', onlyMainDomain);
var email = "someone@ora.co.in";
var emailDomain = email.split('@')[1];
console.log('email domain:', emailDomain);
console.log("valid?" , emailDomain === onlyMainDomain);
//check if email domain is a child of hostName
emailDomainRev = emailDomain.split('.').reverse();
hostNameRev = hostName.split('.').reverse();
var emailDomainIsChildOfHostName = true;
if(emailDomainRev.length > hostNameRev.length)
emailDomainIsChildOfHostName = false;
else
emailDomainIsChildOfHostName = emailDomainRev.reduce(function(acc, item, index)
return acc && (item === hostNameRev[index]);
,true);
console.log("email domain is a child of host name:", emailDomainIsChildOfHostName);
【讨论】:
您假设只有电子邮件的最后两位有效。这不适用于example.co.jp
之类的东西,从技术上讲,您还可以从子域中获取电子邮件,例如me@sub.example.com
。
是的,没错。我想知道OP的所有要求是什么!无论如何,他可以从那里获得完整的域名,他可以使用.
拆分并按照他的意愿进行处理。
谢谢,在所有解决方案中,这个是最好的,目前为止最适合我的情况。
@delphiman 我添加了一个解决方案来检查电子邮件域是否是主机名的子域,它也涵盖了诸如带有.co.in
的域之类的情况。如果主机名是 www.mobile.gmail.com
并且电子邮件是 x@gmail.com
或 x@mobile.gmail.com
,它也会验证为 true【参考方案2】:
这是一个简单的 JavaScript 流程,用于使用您的域名验证电子邮件。
function ValidateEmail(email)
var re = /\S+@\S+\.\S+/; /*Regular expression for valid email*/
return re.test(email); /*Return `true` if valid, Otherwise return `false`*/
var domain = 'www.example@example.com';
var email ='emaxple@example.com';
if(ValidateEmail(email))
email = email.split('@'); /* Split email after `@` Sign*/
email = email[1] /*After split, `email[0]=emaxple, email[1]=emaxple.com`*/
domain = domain.split('').reverse().join(''); /*Now `domain = moc.elpmaxe@elpmaxe.www`*/
email = email.split('').reverse().join(''); /*Now `email = moc.elpmaxe*/
email = email + '@'; /*Now `email = moc.elpmaxe@`*/
if(domain.indexOf(email)==0) /*If only return `0` then valid, Otherwise Invalid*/
/*Valid with your domain*/
else
/*Doesn't match with your domain*/
else
/*Invalid Email*/
【讨论】:
"moc.elpmaxe@elpmaxe.www".indexOf('moc.el') === 0
,您必须在.
拆分并比较每个。
现在我用email = email + '@';
更新了我的代码,所以,现在不再有重复的组合。谢谢@sabithpocker【参考方案3】:
我添加了 Wiktor 建议的正则表达式,并稍作更改以接受没有协议的 url。
您的代码如下所示:
$(document).ready(function()
$("#target").submit(function(event)
var website = $("#website").val();
var websiteDomain = website.replace(/^(https?:\/\/)?(?:www\.)?/, "");
var email = $("#email").val();
var emailDomain = email.substr(email.indexOf("@")+1);
$("span").text(websiteDomain === emailDomain ? "Valid!" : "Not valid!" ).show()
event.preventDefault();
);
);
【讨论】:
【参考方案4】:您的问题有一个棘手的部分。从技术上讲,您可以拥有一个包含任意数量部分的域。例如:this.is.a.valid.domain.com
使用新的自定义***域,它会变得更加棘手,因为它们可以拥有各种疯狂的组合和长度。例如:this.is.also.a.valid.name.on.the.top.level.cake
看起来一点也不像域,但如果您拥有***域 cake
,您可以实现它。
因此,您不能真正修剪子域并确保www.example.com
生成电子邮件@example.com
。但是,您可以判断它是否至少在 @www.example.com
、@example.com
或 @com
上,它们都可能有效。 (实际上,您不能在任何受控的***域上拥有一个,但在极少数情况下允许它可能是件好事。)
这就是为什么大多数网站要求您单击发送给您的电子邮件中的链接以验证您的 URL。
使用我刚刚描述的上述标准,您可以这样做:
var website = "http://www.example.com"; // website from form
var email = "me@example.com"; // email from form
var emailDomain = email.split('@')[1];
var websiteDomain = website.match(/^(?:https?:\/\/)?([^\/]+)/)[1];
var isValidEmail = (websiteDomain || '').lastIndexOf(emailDomain) === (websiteDomain || '').length - (emailDomain || '').length;
isValidEmail
将包含 true
如果它是一个有效的匹配,或者 false
如果它不是。
我已经添加了检查是否出现上述问题,因此如果上述部分之一出现问题,它不会引发错误。如果您提供的网站无效,websiteDomain
将是 undefined
。同样,对于完全无效的电子邮件,emailDomain
将是`未定义的。
【讨论】:
【参考方案5】:我更新了你的代码。我给你这里的链接 https://jsfiddle.net/zm7e8r7p/5/
$(document).ready(function()
$( "#target" ).submit(function(event)
event.preventDefault();
var emailString = $("#email").val();
//cut rule by @
var afterAt = emailString.split('@');
var val = $("#website").val();
var myString = val.substr(-(afterAt[1].length));
console.log(afterAt[1].length);
if (myString == afterAt[1])
console.log('works');return
else
console.log('not');return
;
);
);
【讨论】:
如果我输入这样的域 example.com/test/test/html 并且电子邮件是这样的 user@example.com 将无法正常工作以上是关于如何验证电子邮件地址与网站域匹配?的主要内容,如果未能解决你的问题,请参考以下文章