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) 编辑 收藏 举报