[英]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.