原生js判断域名合法性_验证域名是否合法

更新日期: 2020-10-25阅读: 2.6k标签: 域名

生活中我们肯定会见到很多域名(domain name,简称domain)。域名有很多形式,以句点(.)作为分隔符。这里说的域名是纯域名,不是网址,不包括http://(或https://),也不带斜线。

常见的域名形式

1. 由两个部分组成,例如baidu.com(百度),csdn.net(CSDN),wikipedia.org(维基百科)。
2. 由多个部分组成,例如en.wikipedia.org(英文维基百科),support.google.com(Google帮助页面),info.cern.ch(世界上的第一个网站),acm.hdu.edu.cn(HDU Online Judge)。

共同特征

1. 最后一部分是顶级域名(top-level domain),顶级域名不能随便取,只能是有限的顶级域名之一。
2. 域名中只能包含数字、字母和连字符(好像每个域名要求还不同)。

判断方法

以'.'为分隔符,将域名分成几个部分,最后一部分必须是合法的顶级域名,其它部分不得包含非字母、数字和连字符。实际上还可以包含中文(Unicode字符),这里不考虑。


js判断域名合法性代码

export function DomainParser(domainName) {
var input = domainName;
var modifyName = domainName;
var b_error = false;
var message = "";
DomainParser.prototype.parse = function() {
if (!input || input.length == 0) {
failMessage('请填写域名,例如:***.com');
return;
}
var labels = parseLabels();
if (hasError()) {
return;
}
if (labels.length == 1) {
failMessage('域名格式错误。请输入正确的域名格式,以“.”进行区分 ');
return;
}
var topLabel = labels[labels.length - 1];
if (isDigitLabels(topLabel)) {
failMessage("域名格式错误。请输入正确的域名格式,以“.”进行区分 ");
return;
}
if (input.length > 255) {
failMessage('域名过长。每标号不得超过63个字符。由多个标号组成的完整域名总共不超过255个字符。');
return;
}
var topLevel = parseTopLevel(labels);
console.log(topLevel)
//if (topLevel.labelIndex == 0) {
if(!topLevel.recognized){
failMessage(topLevel.name + '后缀的域名,不支持添加。');
return;
}
var secondLevel = parseSecondLevel(labels, topLevel);
if (secondLevel.labelIndex != 0 && topLevel.recognized) {
modifyName = secondLevel.name + "." + topLevel.name;
}
}

DomainParser.prototype.getModifyName = function() {
return modifyName;
}

function hasError() {
return b_error;
}

DomainParser.prototype.hasError = hasError;

DomainParser.prototype.getMessage = function() {
if (hasError()) {
return message;
} else {
return null;
}
}

function parseLabels() {
var labels = new Array();
var offset = 0;
while (offset < input.length) {
var label = parseLabel();
if (!hasError() && label) {
labels.push(label);
} else {
return;
}
}
return labels;

function parseLabel() {
var labelArr = new Array();
var start = offset;
while (offset < input.length) {
var ch = input.charAt(offset);
var invalid = false;
if (start == offset && !isLetterOrDigit(ch)) {
invalid = true;
} else if ((offset + 1 == input.length || input.charAt(offset + 1) == '.') && !isLetterOrDigit(ch)) {
invalid = true;
} else if (!isLabelChar(ch)) {
invalid = true;
}
if (invalid) {
failMessage('格式错误。域名一般由英文字母、汉字、阿拉伯数字、"-"组成,用“.”分隔,且每段不能以“.”、"-”开头和结尾');
return;
} else {
labelArr.push(ch);
offset++;
if ((offset < input.length && input.charAt(offset) == '.') || (offset == input.length)) {
if (offset < input.length && input.charAt(offset) == '.') {
offset++;
}
if (labelArr.length > 63) {
failMessage('域名过长。每标号不得超过63个字符。由多个标号组成的完整域名总共不超过255个字符。');
return;
}
return labelArr.join("");
}

}
}
}
}

function isLabelChar(ch) {
if (ch.charCodeAt(0) <= 127) {
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || (ch == '-')) {
return true;
} else {
return false;
}
} else {
if ((ch.charCodeAt(0) >= 0xFF00 && ch.charCodeAt(0) <= 0xFFEF) ||
(ch.charCodeAt(0) >= 0x3000 && ch.charCodeAt(0) <= 0x303F)
) {
return false;
} else {
return true;
}
}
}

function isLetterOrDigit(ch) {
if (ch.charCodeAt(0) <= 127) {
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
return true;
} else {
return false;
}
} else {
if ((ch.charCodeAt(0) >= 0xFF00 && ch.charCodeAt(0) <= 0xFFEF) ||
(ch.charCodeAt(0) >= 0x3000 && ch.charCodeAt(0) <= 0x303F)
) {
return false;
} else {
return true;
}
}
}

function isDigitLabels(label) {
var i = 0;
while (i < label.length) {
var ch = label.charAt(i);
if (!(ch >= '0' && ch <= '9')) {
return false;
}
i++;
}
return true;
}
function parseTopLevel(labels) {
var topLevelName = "";
var lowTopLevelName = "";
var topLevel;
var index;
if (labels.length >= 2) {
topLevelName = labels[labels.length - 2] + "." + labels[labels.length - 1];
lowTopLevelName = topLevelName.toLowerCase();
for (index = 0; index < tow_top_level.length; index++) {
if (lowTopLevelName == tow_top_level[index]) {
topLevel = new TopLevel(topLevelName, 2, labels.length - 2, true);
break;
}
}
}
if (!topLevel) {
topLevelName = labels[labels.length - 1];
lowTopLevelName = topLevelName.toLowerCase();
for (index = 0; index < one_top_level.length; index++) {
if (lowTopLevelName == one_top_level[index]) {
topLevel = new TopLevel(topLevelName, 1, labels.length - 1, true);
break;
}
}
}
if (!topLevel) {
topLevelName = labels[labels.length - 1];
topLevel = new TopLevel(topLevelName, 1, labels.length - 1, false);
}
return topLevel;
}

function TopLevel(name, labelCount, labelIndex, recognized) {
this.name = name;
this.labelCount = labelCount;
this.labelIndex = labelIndex;
this.recognized = recognized;
return this;
}

function parseSecondLevel(labels, topLevel) {
var secondLevel = new SecondLevel(labels[topLevel.labelIndex - 1], 1, topLevel.labelIndex - 1);
return secondLevel;
}

function SecondLevel(name, labelCount, labelIndex) {
this.name = name;
this.labelCount = labelCount;
this.labelIndex = labelIndex;
return this;
}

function failMessage(msg) {
message = msg;
b_error = true;
}

var one_top_level = ['ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq',
'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd',
'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bl', 'bm', 'bn', 'bo', 'bq',
'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', 'cf',
'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cu',
'cv', 'cw', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec',
'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm',
'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm',
'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm',
'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int',
'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'ke',
'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la',
'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc',
'md', 'me', 'mf', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', 'mo',
'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw',
'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng',
'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa',
'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'post', 'pr',
'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru',
'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj',
'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'ss', 'st', 'su', 'sv', 'sx',
'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', 'tk', 'tl',
'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', 'tz',
'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg',
'vi', 'vn', 'vu', 'wf', 'ws', '中国', '中國', '香港', '台湾', '台灣',
'新加坡', 'xxx', 'ye', 'yt', 'za', 'zm', 'zw', 'zw', 'xn--fiqs8s',
'xn--fiqz9s', 'xn--j6w193g', 'xn--kprw13d', 'xn--kpry57d',
'xn--yfro4i67o', '公司', '网络', '網絡', 'xn--55qx5d', 'xn--io0a7i',
'top','work','store','site','ltd','xyz','online','vip','art','cloud','wang','beer','link','tech',
'ink','pub','red','biz','win','club','idv','live','shop','app','space','global','systems','firm',
'today','life','love','one','icu',

];
var tow_top_level = ['ac.cn', 'com.cn', 'edu.cn', 'gov.cn', 'mil.cn', 'net.cn', 'org.cn', 'bj.cn',
'sh.cn', 'tj.cn', 'cq.cn', 'he.cn', 'sx.cn', 'nm.cn', 'ln.cn', 'jl.cn',
'hl.cn', 'js.cn', 'zj.cn', 'ah.cn', 'fj.cn', 'jx.cn', 'sd.cn', 'ha.cn',
'hb.cn', 'hn.cn', 'gd.cn', 'gx.cn', 'hi.cn', 'sc.cn', 'gz.cn', 'yn.cn',
'xz.cn', 'sn.cn', 'gs.cn', 'qh.cn', 'nx.cn', 'xj.cn', 'tw.cn', 'hk.cn',
'mo.cn', 'com.af', 'net.af', 'org.af', 'com.ag', 'net.ag', 'org.ag', 'co.at',
'or.at', 'com.bi', 'edu.bi', 'info.bi', 'mo.bi', 'or.bi', 'org.bi', 'com.br',
'net.br', 'org.br', 'co.bz', 'com.bz', 'net.bz', 'org.bz', 'co.cm', 'com.cm',
'net.cm', 'com.co', 'net.co', 'nom.co', 'ar.com', 'br.com', 'cn.com', 'de.com',
'eu.com', 'gb.com', 'gr.com', 'hu.com', 'jpn.com', 'kr.com', 'no.com',
'ru.com', 'se.com', 'uk.com', 'us.com', 'za.com', 'com.de', 'co.dm', 'com.ec',
'fin.ec', 'info.ec', 'med.ec', 'net.ec', 'pro.ec', 'com.es', 'nom.es',
'org.es', 'co.gg', 'net.gg', 'org.gg', 'co.gl', 'com.gl', 'edu.gl', 'net.gl',
'org.gl', 'com.gr', 'co.gy', 'com.gy', 'net.gy', 'com.hk', 'edu.hk', 'gov.hk',
'idv.hk', 'net.hk', 'org.hk', 'com.hn', 'net.hn', 'org.hn', 'adult.ht', 'com.ht',
'info.ht', 'net.ht', 'org.ht', 'org.il', 'co.in', 'firm.in', 'gen.in', 'ind.in',
'net.in', 'org.in', 'bz.it', 'co.it', 'co.je', 'net.je', 'org.je', 'com.ki',
'net.ki', 'org.ki', 'co.kr', 'ne.kr', 'or.kr', 'pe.kr', 're.kr', 'seoul.kr',
'com.lc', 'net.lc', 'org.lc', 'co.mg', 'com.mg', 'net.mg', 'org.mg', 'ac.mu',
'co.mu', 'com.mu', 'net.mu', 'org.mu', 'com.mx', 'gb.net', 'hu.net', 'jp.net',
'se.net', 'uk.net', 'com.nf', 'net.nf', 'org.nf', 'co.nl', 'net.nz', 'org.nz',
'ae.org', 'us.org', 'com.pe', 'net.pe', 'org.pe', 'com.ph', 'com.pk', 'net.pk',
'org.pk', 'biz.pl', 'com.pl', 'info.pl', 'net.pl', 'org.pl', 'waw.pl', 'aaa.pro',
'aca.pro', 'acct.pro', 'avocat.pro', 'bar.pro', 'cpa.pro', 'eng.pro', 'jur.pro',
'law.pro', 'med.pro', 'recht.pro', 'com.ps', 'net.ps', 'org.ps', 'com.pt', 'edu.pt',
'org.pt', 'com.ru', 'net.sb', 'org.sb', 'com.sc', 'net.sc', 'org.sc', 'com.sg',
'com.so', 'net.so', 'org.so', 'club.tw', 'com.tw', 'ebiz.tw', 'game.tw', 'idv.tw',
'org.tw', 'me.uk', 'org.uk', 'co.uz', 'com.uz', 'com.vc', 'net.vc', 'org.vc',
'ac.vn', 'biz.vn', 'com.vn', 'edu.vn', 'gov.vn', 'health.vn', 'info.vn', 'int.vn',
'name.vn', 'net.vn', 'org.vn', 'pro.vn'
];
}

调用

var url ="test.com";
var parser = new DomainParser(domain);
parser.parse();//解析
if (parser.hasError()) {//判断域名不正确
conosole.log(parser.getMessage()); //错误信息
}else{
console.log(parser.getModifyName());//返回域名
}

注意:域名的后缀有很多,代码中只列出了常见的一部分。还有很多后缀,具体的可以在Wiki上搜“Top-level domains”。


链接: https://www.fly63.com/article/detial/9757

如何通过自定义域名方式访问本地WEB应用

自定义域名访问本地WEB应用,本地安装了WEB服务端,怎样通过自定义域名方式实现从公网访问本地WEB应用?本文将介绍具体的实现步骤。安装并启动WEB服务端的默认安装的WEB端口是80。可以在万网、百度云、腾讯云、西部数码等等域名服务商注册并购买域名。

微信域名防封技术,微信域名总是被封如何解决

本身在网站要想在微信中推广,多多少少都会有预防被拦截,是专门为运营网站和公众号的运营者一个研究的工具几十你是正常网站,也是公司企业备案,照样也会被拦截。这个被拦截一般来说就是你的这个域名已经在微信中打不开了

DNS域名解析过程

我们都知道在浏览器通过域名发起一个网络请求的时候,会有DNS服务器将域名解析成ip地址,以便向正确的ip地址发送请求,那么这一个过程具体是怎么处理的呢?今天整理了一下DNS域名解析的过程。大致分为10步:

A记录、CNAME和URL转发区别

我们在做域名解析时,尤其是很多虚拟主机,大都会使用到CNAME解析,独立主机、VPS则用A记录较多,而URL转发则会在更换域名时用到,从设置效果来看,都是“解析”到一个“其它”URL地址,而实际上它们之间还是有些区别的

DNS域名解析步骤

整个过程大体描述如下,其中前两个步骤是在本机完成的,后8个步骤涉及到真正的域名解析服务器:浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。

域名为什么会被腾讯屏蔽封禁如何查询微信域名是否被屏蔽的方法

域名为什么会被腾讯屏蔽封禁:1.域名来源,在微信有过黑历史,被人使用过在微信有过不良记录,后来被人为各种方法恢复后转到你手上

网站域名被墙是什么?

如果域名ping的通却打不开网站(排除服务器宕机),用代理可以打开一般说明域名被封了。假如域名下的网站非法信息多,敏感,又不整改,会直接被GFW墙掉,结果就是访问域名是打不开的。但是解析是正常的。此时域名在国内是无法使用的

为什么很多网站的静态资源使用独立的域名?

不根据访问的条件变化的资源就是静态资源,比如 html,js,css,webfont 等文件。避免发送无意义的 cookie ,当我们的浏览器第一次请求服务器的时候,会根据服务器响应报文中的 set-Cookie 来保存cookie

node如何绑定域名?

网上大部分答案是用使用nginx的反向代理,我记录一下apache服务器怎么设置。在Apache的配置文件中,打开 mod_proxy 和 mod_proxy_http 等等,即去掉 httpd.conf 中的#

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!