眾所周知,獲取當(dāng)前網(wǎng)頁的域名非常簡單,只需要使用JavaScript的location對象中的hostname屬性就行了。但是,如果我們需要獲取某個(gè)網(wǎng)址的頂級域名,常規(guī)方法就無法滿足我們的需求。
那么什么是頂級域名呢?頂級域名指的是在域名中最后一個(gè)“.”之后的部分。比如說,“www.baidu.com”這個(gè)域名的頂級域名就是“com”,“www.google.com.hk”這個(gè)域名的頂級域名就是“hk”。
為了更好地理解問題,下面我們舉一個(gè)具體例子:假設(shè)我們要獲取“abc.sina.com.cn”這個(gè)網(wǎng)址的頂級域名。根據(jù)常規(guī)方法,我們使用location對象獲取其域名,“sina.com.cn”,然后再去解析這個(gè)域名,可能需要使用正則表達(dá)式進(jìn)行匹配處理,才能夠得到其頂級域名“cn”。這個(gè)過程雖然不難,但是卻比較繁瑣,并且容易出錯(cuò)。
function getTopLevelDomain(url) { var regex = /^https?:\/\/(?:[^.]+\.)?([^.]+\.[^.]+)/; var matches = url.match(regex); if (matches) { return matches[1]; } return null; } var url = "http://abc.sina.com.cn/index.html"; var topLevelDomain = getTopLevelDomain(url); console.log(topLevelDomain); // cn
上面的代碼使用了正則表達(dá)式來匹配域名,并且使用了match函數(shù)來獲取匹配結(jié)果。雖然這個(gè)方法可以解決問題,但是存在一些缺點(diǎn)。首先,正則表達(dá)式的編寫難度較大,需要考慮多種情況;其次,如果我們要對多個(gè)網(wǎng)址進(jìn)行處理,需要不斷地調(diào)用這個(gè)函數(shù),效率也并不高。
那么有沒有一種更加簡便的方法呢?答案是肯定的。我們可以借助于JavaScript提供的URL對象來獲取頂級域名。這個(gè)對象可以幫助我們解析網(wǎng)址,獲取其中各個(gè)部分的信息。
function getTopLevelDomain(url) { var u = new URL(url); var domainParts = u.hostname.split("."); if (domainParts.length >= 2) { return domainParts[domainParts.length - 2] + "." + domainParts[domainParts.length - 1]; } return null; } var url = "http://abc.sina.com.cn/index.html"; var topLevelDomain = getTopLevelDomain(url); console.log(topLevelDomain); // sina.com.cn
這個(gè)方法的思路非常簡單,就是先使用URL對象來解析網(wǎng)址,然后獲取其hostname屬性,再將其按照“.”進(jìn)行切割,取最后兩個(gè)部分,拼接在一起就是頂級域名。這樣的方法不僅簡單易懂,而且效率也較高。而且,如果我們要處理多個(gè)網(wǎng)址,也可以直接構(gòu)造URL對象,而不需要在每個(gè)網(wǎng)址上都調(diào)用函數(shù)。
需要注意的是,這個(gè)方法只適用于瀏覽器環(huán)境,如果要在Node.js環(huán)境下獲取頂級域名,需要使用第三方模塊,如“tldjs”。
總之,獲取頂級域名是在Web開發(fā)中經(jīng)常遇到的問題,我們可以通過借助于JavaScript的URL對象來解決這個(gè)問題,并且這個(gè)方法比正則表達(dá)式更加簡單明了,大大提高了代碼的可讀性。