如何使用JavaScript从域名中删除子域名

16

我从这样的域名开始:

www.exemple.com
main.testsite.com
www.ex-emple.com.ar
main.test-site.co.uk
en.tour.mysite.nl
www.ip.com
www.one.lv

我需要去除子域名以获得像这样的值:

exemple.com
testsite.com
ex-emple.com.ar
test-site.co.uk
mysite.nl
ip.com
one.lv

其他顶级域:

.ac
.ad
.ae
.af
.ag
.ai
.al
.am
.ao
.aq
.ar
.as
.asia
.at
.au
.aw
.ax
.az
.ba
.bb
.bd
.be
.bf
.bg
.bh
.bi
.bj
.bm
.bn
.bo
.br
.bs
.bt
.bw
.by
.bz
.ca
.cc
.cd
.cf
.cg
.ch
.ci
.ck
.cl
.cm
.cn
.co
.co.ao
.co.ba
.co.bw
.co.cc
.co.ck
.co.cr
.co.fk
.co.id
.co.il
.co.im
.co.in
.co.jp
.co.ke
.co.kr
.co.ls
.co.ma
.co.mz
.co.nl
.co.nz
.co.th
.co.tz
.co.ug
.co.uk
.co.uz
.co.ve
.co.vi
.co.za
.co.zm
.co.zw
.com
.com.af
.com.ag
.com.ai
.com.al
.com.ar
.com.au
.com.aw
.com.az
.com.bb
.com.bd
.com.bh
.com.bi
.com.bm
.com.bn
.com.bo
.com.br
.com.bs
.com.bt
.com.by
.com.bz
.com.cm
.com.cn
.com.co
.com.cu
.com.cv
.com.cy
.com.do
.com.dz
.com.ec
.com.ee
.com.eg
.com.es
.com.et
.com.fj
.com.ge
.com.gh
.com.gi
.com.gl
.com.gn
.com.gp
.com.gr
.com.gt
.com.gu
.com.hk
.com.hn
.com.hr
.com.ht
.com.jm
.com.jo
.com.kg
.com.kh
.com.ki
.com.kw
.com.ky
.com.kz
.com.lb
.com.lc
.com.lk
.com.lr
.com.lv
.com.ly
.com.mg
.com.mk
.com.mm
.com.mo
.com.mt
.com.mu
.com.mv
.com.mw
.com.mx
.com.my
.com.na
.com.nf
.com.ng
.com.ni
.com.np
.com.nr
.com.om
.com.pa
.com.pe
.com.pg
.com.ph
.com.pk
.com.pl
.com.pr
.com.ps
.com.pt
.com.py
.com.qa
.com.ro
.com.sa
.com.sb
.com.sc
.com.sg
.com.sl
.com.sn
.com.sv
.com.sy
.com.tj
.com.tn
.com.tr
.com.tt
.com.tw
.com.ua
.com.uy
.com.uz
.com.vc
.com.ve
.com.vi
.com.vn
.com.ye
.cr
.cv
.cx
.cy
.cz
.de
.dj
.dk
.dm
.do
.dz
.ec
.edu
.ee
.eg
.es
.eu
.fi
.fj
.fk
.fm
.fo
.fr
.ga
.gd
.ge
.gf
.gg
.gh
.gi
.gl
.gm
.gn
.gov
.gp
.gq
.gr
.gs
.gt
.gu
.gy
.hk
.hm
.hn
.hr
.ht
.hu
.id
.ie
.il
.im
.in
.io
.iq
.is
.it
.je
.jm
.jo
.jp
.ke
.kg
.kh
.ki
.km
.kn
.kr
.kw
.ky
.kz
.la
.lb
.lc
.li
.lk
.lr
.ls
.lt
.lu
.lv
.ly
.ma
.mc
.md
.me
.mg
.mil
.mk
.ml
.mm
.mn
.mo
.mobi
.mp
.mq
.mr
.ms
.mt
.mu
.mv
.mw
.mx
.my
.na
.name
.nc
.ne
.ne.jp
.net
.net.ck
.net.cm
.net.in
.nf
.ng
.ni
.nl
.no
.np
.nr
.nu
.nz
.og.ao
.om
.or.th
.org
.org.ck
.org.cn
.org.ls
.pa
.pe
.pf
.pg
.ph
.pk
.pl
.pm
.pn
.pr
.pro
.ps
.pt
.py
.qa
.re
.ro
.rs
.ru
.rw
.sa
.sb
.sc
.se
.sg
.sh
.si
.sk
.sl
.sm
.sn
.so
.sr
.st
.su
.sv
.sy
.tc
.td
.tf
.tg
.th
.tj
.tk
.tl
.tm
.tn
.to
.tr
.tt
.tv
.tw
.tz
.ua
.ug
.uk
.us
.uy
.uz
.vc
.ve
.vg
.vi
.vn
.vu
.wf
.ws
.xxx
.ye
.yt
.za
.zm
.zw

3
使用 .replace 方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace。如果您的代码有问题,请发帖求助。 - Felix Kling
为了做到这一点,您需要知道有效的顶级域名,因此我已将它们添加回问题中。这可能有助于告知那些发布答案的人。 - Prestaul
2
在npm上有一个名为psl的库可以满足你的需求。代码:const domain = psl.get(host);。它使用Mozilla的公共后缀列表,被认为是此类信息的官方资源。 - chickens
@chickens 正确。而且可以直接将它包含到页面中,如:<script src="https://cdnjs.cloudflare.com/ajax/libs/psl/1.9.0/psl.min.js"> - Marinos An
@MarinosAn,请不要进行实质性改变问题主旨的编辑。你在这里做了很多假设。 - Chris
2个回答

10
var result = string.replace(/^[^.]+\./g, "");

有任何下投票的原因吗?是不是OP想要保留第二级域名,将像co.uk这样的东西视为顶级域名? - Alexander Pavlov
1
我给了你一个+1,但我猜@usr13的“en.tour.mysite.nl”=>“mysite.nl”的替换在你的答案中不起作用,所以也许他们正在寻找“domain”“.com”“可选.uk”,而不总是删除第一个部分? - Rob I
@RobI:感谢你的提示,实际上很难推断出替换的通用规则。 - Alexander Pavlov
正则表达式有点像魔方。很有趣的是,要看一个单一的正则表达式是否能够处理所有给定的域名,而不用参考允许扩展名数组。 - Claude
4
似乎这种方法无法适用于多个子域名,例如 "en.tour.mysite.nl"。 - gimp3695
1
@gimp3695 这适用于多个子域名:var result = string.split(".").slice(-2).join(".")。但对于"co.uk"这样的域名无效。 - Guido

0

psl 库在 npm 上可以实现你所要求的功能。

const domain = psl.get(host);

它使用Mozilla的公共后缀列表,这被认为是此信息的官方资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接