Javascript 判断域名合法性,JS域名格式检测

其实域名没法很好的判断,因为后缀不确定,不断的增加。所以能完美的判断还是得不断的更新。

Javascript 域名判断源码

  1 function DomainParser(domainName) {
  2     var input = domainName;
  3     var modifyName = domainName;
  4     var b_error = false;
  5     var message = "";
  6     DomainParser.prototype.parse = function () {
  7         if (!input || input.length == 0) {
  8             failMessage('请填写域名,例如:sojson.com');
  9             return;
 10         }
 11         var labels = parseLabels();
 12         if (hasError()) {
 13             return;
 14         }
 15         if (labels.length == 1) {
 16             failMessage('域名格式错误。请输入正确的域名格式,以“.”进行区分 ');
 17             return;
 18         }
 19         var topLabel = labels[labels.length - 1];
 20         if (isDigitLabels(topLabel)) {
 21             failMessage("域名格式错误。请输入正确的域名格式,以“.”进行区分 ");
 22             return;
 23         }
 24         if (input.length > 255) {
 25             failMessage('域名过长。每标号不得超过63个字符。由多个标号组成的完整域名总共不超过255个字符。');
 26             return;
 27         }
 28         var topLevel = parseTopLevel(labels);
 29         if (topLevel.labelIndex == 0) {
 30             failMessage(topLevel.name + '是域名后缀,不能查询。');
 31             return;
 32         }
 33         var secondLevel = parseSecondLevel(labels, topLevel);
 34         if (secondLevel.labelIndex != 0 && topLevel.recognized) {
 35             modifyName = secondLevel.name + "." + topLevel.name;
 36         }
 37     }
 38 
 39     DomainParser.prototype.getModifyName = function () {
 40         return modifyName;
 41     }
 42 
 43     function hasError() {
 44         return b_error;
 45     }
 46 
 47     DomainParser.prototype.hasError = hasError;
 48 
 49     DomainParser.prototype.getMessage = function () {
 50         if (hasError()) {
 51             return message;
 52         } else {
 53             return null;
 54         }
 55     }
 56 
 57     function parseLabels() {
 58         var labels = new Array();
 59         var offset = 0;
 60         while (offset < input.length) {
 61             var label = parseLabel();
 62             if (!hasError() && label) {
 63                 labels.push(label);
 64             } else {
 65                 return;
 66             }
 67         }
 68         return labels;
 69 
 70         function parseLabel() {
 71             var labelArr = new Array();
 72             var start = offset;
 73             while (offset < input.length) {
 74                 var ch = input.charAt(offset);
 75                 var invalid = false;
 76                 if (start == offset && !isLetterOrDigit(ch)) {
 77                     invalid = true;
 78                 } else if ((offset + 1 == input.length || input.charAt(offset + 1) == '.') && !isLetterOrDigit(ch)) {
 79                     invalid = true;
 80                 } else if (!isLabelChar(ch)) {
 81                     invalid = true;
 82                 }
 83                 if (invalid) {
 84                     failMessage('格式错误。域名一般由英文字母、汉字、阿拉伯数字、"-"组成,用“.”分隔,且每段不能以“.”、"-”开头和结尾');
 85                     return;
 86                 } else {
 87                     labelArr.push(ch);
 88                     offset++;
 89                     if ((offset < input.length && input.charAt(offset) == '.') || (offset == input.length)) {
 90                         if (offset < input.length && input.charAt(offset) == '.') {
 91                             offset++;
 92                         }
 93                         if (labelArr.length > 63) {
 94                             failMessage('域名过长。每标号不得超过63个字符。由多个标号组成的完整域名总共不超过255个字符。');
 95                             return;
 96                         }
 97                         return labelArr.join("");
 98                     }
 99 
100                 }
101             }
102         }
103     }
104 
105     function isLabelChar(ch) {
106         if (ch.charCodeAt(0) <= 127) {
107             if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || (ch == '-')) {
108                 return true;
109             } else {
110                 return false;
111             }
112         } else {
113             if ((ch.charCodeAt(0) >= 0xFF00 && ch.charCodeAt(0) <= 0xFFEF) ||
114                 (ch.charCodeAt(0) >= 0x3000 && ch.charCodeAt(0) <= 0x303F)
115             ) {
116                 return false;
117             } else {
118                 return true;
119             }
120         }
121     }
122 
123     function isLetterOrDigit(ch) {
124         if (ch.charCodeAt(0) <= 127) {
125             if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
126                 return true;
127             } else {
128                 return false;
129             }
130         } else {
131             if ((ch.charCodeAt(0) >= 0xFF00 && ch.charCodeAt(0) <= 0xFFEF) ||
132                 (ch.charCodeAt(0) >= 0x3000 && ch.charCodeAt(0) <= 0x303F)
133             ) {
134                 return false;
135             } else {
136                 return true;
137             }
138         }
139     }
140 
141     function isDigitLabels(label) {
142         var i = 0;
143         while (i < label.length) {
144             var ch = label.charAt(i);
145             if (!(ch >= '0' && ch <= '9')) {
146                 return false;
147             }
148             i++;
149         }
150         return true;
151     }
152 
153     function parseTopLevel(labels) {
154         var topLevelName = "";
155         var lowTopLevelName = "";
156         var topLevel;
157         var index;
158         if (labels.length >= 2) {
159             topLevelName = labels[labels.length - 2] + "." + labels[labels.length - 1];
160             lowTopLevelName = topLevelName.toLowerCase();
161             for (index = 0; index < tow_top_level.length; index++) {
162                 if (lowTopLevelName == tow_top_level[index]) {
163                     topLevel = new TopLevel(topLevelName, 2, labels.length - 2, true);
164                     break;
165                 }
166             }
167         }
168         if (!topLevel) {
169             topLevelName = labels[labels.length - 1];
170             lowTopLevelName = topLevelName.toLowerCase();
171             for (index = 0; index < one_top_level.length; index++) {
172                 if (lowTopLevelName == one_top_level[index]) {
173                     topLevel = new TopLevel(topLevelName, 1, labels.length - 1, true);
174                     break;
175                 }
176             }
177         }
178         if (!topLevel) {
179             topLevelName = labels[labels.length - 1];
180             topLevel = new TopLevel(topLevelName, 1, labels.length - 1, false);
181         }
182         return topLevel;
183     }
184 
185     function TopLevel(name, labelCount, labelIndex, recognized) {
186         this.name = name;
187         this.labelCount = labelCount;
188         this.labelIndex = labelIndex;
189         this.recognized = recognized;
190         return this;
191     }
192 
193     function parseSecondLevel(labels, topLevel) {
194         var secondLevel = new SecondLevel(labels[topLevel.labelIndex - 1], 1, topLevel.labelIndex - 1);
195         return secondLevel;
196     }
197 
198     function SecondLevel(name, labelCount, labelIndex) {
199         this.name = name;
200         this.labelCount = labelCount;
201         this.labelIndex = labelIndex;
202         return this;
203     }
204 
205     function failMessage(msg) {
206         message = msg;
207         b_error = true;
208     }
209 
210     var one_top_level = ['ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq',
211         'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd',
212         'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bl', 'bm', 'bn', 'bo', 'bq',
213         'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', 'cf',
214         'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cu',
215         'cv', 'cw', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec',
216         'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm',
217         'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm',
218         'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm',
219         'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int',
220         'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'ke',
221         'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la',
222         'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc',
223         'md', 'me', 'mf', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', 'mo',
224         'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw',
225         'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng',
226         'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa',
227         'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'post', 'pr',
228         'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru',
229         'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj',
230         'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'ss', 'st', 'su', 'sv', 'sx',
231         'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', 'tk', 'tl',
232         'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', 'tz',
233         'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg',
234         'vi', 'vn', 'vu', 'wf', 'ws', '中国', '中國', '香港', '台湾', '台灣',
235         '新加坡', 'xxx', 'ye', 'yt', 'za', 'zm', 'zw', 'zw', 'xn--fiqs8s',
236         'xn--fiqz9s', 'xn--j6w193g', 'xn--kprw13d', 'xn--kpry57d',
237         'xn--yfro4i67o', '公司', '网络', '網絡', 'xn--55qx5d', 'xn--io0a7i'
238     ];
239     var tow_top_level = ['ac.cn', 'com.cn', 'edu.cn', 'gov.cn', 'mil.cn', 'net.cn', 'org.cn', 'bj.cn',
240         'sh.cn', 'tj.cn', 'cq.cn', 'he.cn', 'sx.cn', 'nm.cn', 'ln.cn', 'jl.cn',
241         'hl.cn', 'js.cn', 'zj.cn', 'ah.cn', 'fj.cn', 'jx.cn', 'sd.cn', 'ha.cn',
242         'hb.cn', 'hn.cn', 'gd.cn', 'gx.cn', 'hi.cn', 'sc.cn', 'gz.cn', 'yn.cn',
243         'xz.cn', 'sn.cn', 'gs.cn', 'qh.cn', 'nx.cn', 'xj.cn', 'tw.cn', 'hk.cn',
244         'mo.cn', 'com.af', 'net.af', 'org.af', 'com.ag', 'net.ag', 'org.ag', 'co.at',
245         'or.at', 'com.bi', 'edu.bi', 'info.bi', 'mo.bi', 'or.bi', 'org.bi', 'com.br',
246         'net.br', 'org.br', 'co.bz', 'com.bz', 'net.bz', 'org.bz', 'co.cm', 'com.cm',
247         'net.cm', 'com.co', 'net.co', 'nom.co', 'ar.com', 'br.com', 'cn.com', 'de.com',
248         'eu.com', 'gb.com', 'gr.com', 'hu.com', 'jpn.com', 'kr.com', 'no.com',
249         'ru.com', 'se.com', 'uk.com', 'us.com', 'za.com', 'com.de', 'co.dm', 'com.ec',
250         'fin.ec', 'info.ec', 'med.ec', 'net.ec', 'pro.ec', 'com.es', 'nom.es',
251         'org.es', 'co.gg', 'net.gg', 'org.gg', 'co.gl', 'com.gl', 'edu.gl', 'net.gl',
252         'org.gl', 'com.gr', 'co.gy', 'com.gy', 'net.gy', 'com.hk', 'edu.hk', 'gov.hk',
253         'idv.hk', 'net.hk', 'org.hk', 'com.hn', 'net.hn', 'org.hn', 'adult.ht', 'com.ht',
254         'info.ht', 'net.ht', 'org.ht', 'org.il', 'co.in', 'firm.in', 'gen.in', 'ind.in',
255         'net.in', 'org.in', 'bz.it', 'co.it', 'co.je', 'net.je', 'org.je', 'com.ki',
256         'net.ki', 'org.ki', 'co.kr', 'ne.kr', 'or.kr', 'pe.kr', 're.kr', 'seoul.kr',
257         'com.lc', 'net.lc', 'org.lc', 'co.mg', 'com.mg', 'net.mg', 'org.mg', 'ac.mu',
258         'co.mu', 'com.mu', 'net.mu', 'org.mu', 'com.mx', 'gb.net', 'hu.net', 'jp.net',
259         'se.net', 'uk.net', 'com.nf', 'net.nf', 'org.nf', 'co.nl', 'net.nz', 'org.nz',
260         'ae.org', 'us.org', 'com.pe', 'net.pe', 'org.pe', 'com.ph', 'com.pk', 'net.pk',
261         'org.pk', 'biz.pl', 'com.pl', 'info.pl', 'net.pl', 'org.pl', 'waw.pl', 'aaa.pro',
262         'aca.pro', 'acct.pro', 'avocat.pro', 'bar.pro', 'cpa.pro', 'eng.pro', 'jur.pro',
263         'law.pro', 'med.pro', 'recht.pro', 'com.ps', 'net.ps', 'org.ps', 'com.pt', 'edu.pt',
264         'org.pt', 'com.ru', 'net.sb', 'org.sb', 'com.sc', 'net.sc', 'org.sc', 'com.sg',
265         'com.so', 'net.so', 'org.so', 'club.tw', 'com.tw', 'ebiz.tw', 'game.tw', 'idv.tw',
266         'org.tw', 'me.uk', 'org.uk', 'co.uz', 'com.uz', 'com.vc', 'net.vc', 'org.vc',
267         'ac.vn', 'biz.vn', 'com.vn', 'edu.vn', 'gov.vn', 'health.vn', 'info.vn', 'int.vn',
268         'name.vn', 'net.vn', 'org.vn', 'pro.vn'
269     ];
270 }

 

Javascript 域名判断使用方法

var domain ="sojson.com";

var parser = new DomainParser(domain);

//解析

parser.parse();

//判断是否正常

if (parser.hasError()) {

//错误信息

var msg = parser.getMessage();

return;

}

//获取域名

domain = encodeURI(parser.getModifyName());

posted on 2021-04-14 00:12  zhangzongshan  阅读(3014)  评论(1编辑  收藏  举报

导航