[英]How to validate email address match with website domain?
我在表单上有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();
}
});
});
您可以使用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);
这是一个简单的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*/
}
我添加了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();
});
});
您的问题有一个棘手的部分。 从技术上讲,您可以拥有包含任意数量部分的域。 例如: 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
也将是未定义的。
我更新您的代码。 我在这里给你链接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
};
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.