2016-03-08 92 views
-3

我想要一個機制從location.hostname中提取子域,這應該足以滿足以下所有情況。從主機名提取子域

1. example.com => return value is blank since no sub domain 
2. www.example.com => return value is blank since no sub domain 
3. test.example.com => return value should be test since this is the sub domain 
4. example.co.in => return value is blank since no sub domain 
5. www.example.co.in => return value is blank since no sub domain 
6. test.example.co.in => return value should be test since this is the sub domain 
7. 183.87.46.82 => return value is blank since IP passed 

僅針對上述給定的場景,我需要處理。我不期待這件事。最重要的是,我不需要提取任何嵌套的子域名,只有第一級子域名就足夠了。

在這方面的任何想法都會有所幫助。

+0

如下回答可以幫助你 - HTTP: //stackoverflow.com/a/23945027/2020893 –

+0

這也是 - https://css-tricks.com/snippets/javascript/get-url-and-url-parts-in-javascript/ –

+1

投票結束,因爲SO不是代碼編寫服務。 – RobG

回答

0

我個人認爲www是一個子域,在「第二level'域的情況下(.co.uk)我實際上會考慮co的域名和任何之前它會是一個子域名。

因爲這並不能真正回答你的問題,所以下面的方法完全基於你的輸入(當你發現'second-level' domains(該列表不包括所有內容)時,你將會修改它) 。

function subdomain(host) { 
    var part = host.split('.').reverse(), 
     index = 0; 

    while (part[index].length === 2 || !index) { 
     ++index; 
    } 
    ++index; 

    return part.length > index && part[index] !== 'www' ? part[index] : ''; 
} 

Working example

這樣做是應用很不客氣的規則,即「第二level'域總是由2×2字符(co.ukco.in等)和過濾那些,然後跳到現在認爲是主要的域名,並跳過這一點。如果最後我們確定了索引上的某些內容,並且它與「www」不匹配,則將其還原。

這只是一個例子,向您展示您的問題是多麼困難,因爲它需要一個最新的(如主動維護的,策劃的)「二級」域列表,否則您可能會失敗。

我其實只考慮了some.deep.nested.sub.domain.com會給你sub而不是some

(另外請注意,我沒有主動阻止ip匹配,它恰好匹配2x2規則)。


我很好奇你試圖解決的問題,試圖隔離子域,因爲它本身沒有任何意義。我可以想到你想根據子域顯示排序的'暱稱'的情況,但是我會重新考慮你會知道預期的模式。從技術角度來看,只有子域是無用的。

+0

謝謝...這是我正在尋找的 – user850234

+0

@ user850234請考慮我在答案中提出的所有問題,他們可能現在不適用,但最終技術有一個讓你無法控制的惡習。 –

+0

是的......我將所有這些考慮在內......我試圖解決的情況是我的應用程序中有多個子域登錄,UI必須從URL中提取,然後使用相同的子域名後續與API的通信以及無效的子域顯示用戶友好的消息並加載相關屏幕 – user850234

0

試試這個:

["example.com", 
    "www.example.com", 
    "test.example.com", 
    "http://example.co.in", 
    "http://www.example.co.in", 
    "test.example.co.in", 
    "http://183.87.46.82"] 
     .filter(function(url){ 
      return url.match(/^(?!www).*\.(.*)\.co.*$/g) 
     }) 

更新的正則表達式

^(?!www).*\.(.*)\.co.*$ 
+0

這個地址'wiki.wargaming.co.uk'怎麼樣? – RomanPerekhrest

+0

更新正則表達式來支持'wiki.wargaming.co.uk' url – Zamboney

1

請看下面的文章定義有效的主機名:
http://tools.ietf.org/html/rfc952
http://tools.ietf.org/html/rfc1123
此正則表達式應該可以幫助你在你的情況:

var regex = /^(?!www\.|\d{1,3}\.)[a-z0-9-]+?\.[a-z0-9-]{3,}\.[a-z0-9-]+?(\.[a-z0-9-]+?)*?$/gi; 

var hostname = "example.com"; 
console.log(hostname.match(regex)); // null 

hostname = "www.example.com"; 
console.log(hostname.match(regex)); // null 

hostname = "test.example.com"; 
console.log(hostname.match(regex)); // [ "test.example.com" ] 

hostname = "www.example.com"; 
console.log(hostname.match(regex)); // null 

hostname = "example.co.in"; 
console.log(hostname.match(regex)); // null 

hostname = "www.example.co.in"; 
console.log(hostname.match(regex)); // null 

hostname = "1test.example.co.in"; 
console.log(hostname.match(regex)); // [ "1test.example.co.in" ] 

hostname = "187.162.10.12"; 
console.log(hostname.match(regex)); // null 

https://jsfiddle.net/fknhumw3/