-
Notifications
You must be signed in to change notification settings - Fork 0
/
domainSuffix.ts
92 lines (86 loc) · 2.06 KB
/
domainSuffix.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { SuffixList } from "./suffix";
import * as Punycode from "punycode"
export class DomainSuffix {
private suffixList;
/**
* 可配置
*/
config(list: any) {
this.loadSuffixList(list);
}
private loadSuffixList(list?: any) {
this.suffixList = Object.assign(SuffixList, list);
}
/**
* 解析
* @param url 解析链接
*/
parse(url: string) {
if (!this.suffixList) {
this.loadSuffixList();
}
if (url) {
// 正则匹配找出链接中的主机
let urls = /(([a-z\u00a1-\uffff0-9-]*)\.)+([a-zA-Z\u4e00-\u9faf]{2,})/i.exec(url);
if (urls) {
// 重置为小写
let host = urls[0].toLocaleLowerCase();
host = this.punyDecode(host);
let suffix, domain;
let parts = host.split(".");
if (this.suffixList[host]) {
suffix = host;
} else {
for (let i = parts.length; i > 0; i--) {
let _domain = parts.join(".");
let _suffix = parts.slice(1 - i).join(".")
let _star_suffix = "*." + parts.slice(2 - i).join(".")
let _exp_suffix = `!${_suffix}`;
if (this.suffixList[_exp_suffix]) {
[suffix, domain] = [_suffix.split(".").slice(1).join("."), _domain];
break;
}
if (this.suffixList[_star_suffix]) {
[suffix, domain] = [parts.slice(1 - i).join("."), _domain];
break;
}
if (this.suffixList[_suffix]) {
[suffix, domain] = [_suffix, _domain];
break;
}
}
}
if (suffix || domain) {
if (suffix != domain) {
return { suffix, domain };
}
}
}
}
}
/**解析puny编码 */
private punyDecode(url: string) {
let oriUrl = [];
url.split(".").map(item => {
if (item.match(/^xn--/)) {
item = item.replace(/^xn--/, "");
oriUrl.push(Punycode.decode(item));
} else {
oriUrl.push(item);
}
})
return oriUrl.join(".")
}
/**puny编码 */
private punyEncode(url: string) {
let punyUrl = [];
url.split(".").map(item => {
if (item.match(/[\u00a1-\uffff]/)) {
punyUrl.push("xn--" + Punycode.encode(item));
} else {
punyUrl.push(item);
}
})
return punyUrl.join(".");
}
}