2011-11-24 56 views
8

我只想使用javascript獲取域名。例如如何僅使用javascript獲取域名?

vn.search.yahoo.com -> yahoo 
vn.search.yahoo.com.vn -> yahoo 
sub1.sub2.sub3.abcdef.co.uk -> abcdef 

謝謝! (例如:www,email,cdn,支持...)

+0

這是否需要在所有域上運行?如果沒有,您使用的是哪種域名? ('subd.subd.domain.com','domain.com','http:// domain.com'等) – Purag

+0

你對「[域名]」(http://en.wikipedia.org/)的定義是什麼?維基/域名)「? – RobG

+0

這是爲你做的嗎? http://jsfiddle.net/purmou/TzjJE/ – Purag

回答

27

使用location.host和切斷子域和TLD:

var domain = (location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1] 

更新:作爲@demix指出,失敗2和3個字母域。它也不適用於像aerojobs和其他幾十個域名。

周圍的唯一辦法是提前知道有效的頂級域名,所以這裏是一個比較合適的功能:

// http://data.iana.org/TLD/tlds-alpha-by-domain.txt 
var TLDs = ["ac", "ad", "ae", "aero", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "biz", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cat", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "com", "coop", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "edu", "ee", "eg", "er", "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "info", "int", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo", "mobi", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx", "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sy", "sz", "tc", "td", "tel", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tp", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "xn--0zwm56d", "xn--11b5bs3a9aj6g", "xn--3e0b707e", "xn--45brj9c", "xn--80akhbyknj4f", "xn--90a3ac", "xn--9t4b11yi5a", "xn--clchc0ea0b2g2a9gcd", "xn--deba0ad", "xn--fiqs8s", "xn--fiqz9s", "xn--fpcrj9c3d", "xn--fzc2c9e2c", "xn--g6w251d", "xn--gecrj9c", "xn--h2brj9c", "xn--hgbk6aj7f53bba", "xn--hlcj6aya9esc7a", "xn--j6w193g", "xn--jxalpdlp", "xn--kgbechtv", "xn--kprw13d", "xn--kpry57d", "xn--lgbbat1ad8j", "xn--mgbaam7a8h", "xn--mgbayh7gpa", "xn--mgbbh1a71e", "xn--mgbc0a9azcg", "xn--mgberp4a5d4ar", "xn--o3cw4h", "xn--ogbpf8fl", "xn--p1ai", "xn--pgbs0dh", "xn--s9brj9c", "xn--wgbh1c", "xn--wgbl6a", "xn--xkc2al3hye2a", "xn--xkc2dl3a5ee0h", "xn--yfro4i67o", "xn--ygbi2ammx", "xn--zckzah", "xxx", "ye", "yt", "za", "zm", "zw"].join() 

function getDomain(url){ 

    var parts = url.split('.'); 
    if (parts[0] === 'www' && parts[1] !== 'com'){ 
     parts.shift() 
    } 
    var ln = parts.length 
     , i = ln 
     , minLength = parts[parts.length-1].length 
     , part 

    // iterate backwards 
    while(part = parts[--i]){ 
     // stop when we find a non-TLD part 
     if (i === 0     // 'asia.com' (last remaining must be the SLD) 
      || i < ln-2    // TLDs only span 2 levels 
      || part.length < minLength // 'www.cn.com' (valid TLD as second-level domain) 
      || TLDs.indexOf(part) < 0 // officialy not a TLD 
     ){ 
      return part 
     } 
    } 
} 

getDomain(location.host) 

我希望我沒有錯過太多角落的情況。 http://jsfiddle.net/hqBKd/4/

頂級域名的列表可以在這裏找到::http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

+1

將無法​​正常工作。將不得不驗證TLD:/ – demix

+0

@demix oops,則 –

+0

這將適用於所提供的示例,但正如demix所說,名稱長度爲2和3的域名將失敗,特別是URL縮短域名屬於此類別。 –

-1

很簡單:

var tokens = document.domain.split('.'); 
    var domain = tokens[tokens.length - 2]; 
+0

只適用於'subdomain.domain.com':http://jsfiddle.net/purmou/Pgarw/ – Purag

+0

我測試了兩個它的工作原理。至少在FF。也許一些瀏覽器的怪癖? – ioseb

+0

這不適用於具有兩個級別的域(如.com.vn&co.uk)。例如,它不會在vn.search.yahoo.com.vn上工作,它會給'com'而不是'yahoo'。請參閱http://jsfiddle.net/gagan/SLeKQ/ –

1

我能想象的唯一方法是列出所有的TLD樣本代碼本應在location對象:(

測試用例是可用如下圖所示。

function getDomainName(){ 
    var domainList = ['com','org','net',...];//all TLD 
    var tokens = document.domain.split('.'); 
    while(tokens.length){ 
     var token = tokens.pop(); 
     if(domainList.indexOf(token) == -1){ 
      return token; 
     } 
    } 
    return null; 
} 

Array.prototype.indexOf應該做一些修復在IE中。

0

我neede d做到這一點,掀起了一些簡單的佔了我的使用情況

function stripSubDomainAndTLD (domain) { 
    return domain.replace(/^(?:[a-z0-9\-\.]+\.)??([a-z0-9\-]+)(?:\.com|\.net|\.org|\.biz|\.ws|\.in|\.me|\.co\.uk|\.co|\.org\.uk|\.ltd\.uk|\.plc\.uk|\.me\.uk|\.edu|\.mil|\.br\.com|\.cn\.com|\.eu\.com|\.hu\.com|\.no\.com|\.qc\.com|\.sa\.com|\.se\.com|\.se\.net|\.us\.com|\.uy\.com|\.ac|\.co\.ac|\.gv\.ac|\.or\.ac|\.ac\.ac|\.af|\.am|\.as|\.at|\.ac\.at|\.co\.at|\.gv\.at|\.or\.at|\.asn\.au|\.com\.au|\.edu\.au|\.org\.au|\.net\.au|\.id\.au|\.be|\.ac\.be|\.adm\.br|\.adv\.br|\.am\.br|\.arq\.br|\.art\.br|\.bio\.br|\.cng\.br|\.cnt\.br|\.com\.br|\.ecn\.br|\.eng\.br|\.esp\.br|\.etc\.br|\.eti\.br|\.fm\.br|\.fot\.br|\.fst\.br|\.g12\.br|\.gov\.br|\.ind\.br|\.inf\.br|\.jor\.br|\.lel\.br|\.med\.br|\.mil\.br|\.net\.br|\.nom\.br|\.ntr\.br|\.odo\.br|\.org\.br|\.ppg\.br|\.pro\.br|\.psc\.br|\.psi\.br|\.rec\.br|\.slg\.br|\.tmp\.br|\.tur\.br|\.tv\.br|\.vet\.br|\.zlg\.br|\.br|\.ab\.ca|\.bc\.ca|\.mb\.ca|\.nb\.ca|\.nf\.ca|\.ns\.ca|\.nt\.ca|\.on\.ca|\.pe\.ca|\.qc\.ca|\.sk\.ca|\.yk\.ca|\.ca|\.cc|\.ac\.cn|\.com\.cn|\.edu\.cn|\.gov\.cn|\.org\.cn|\.bj\.cn|\.sh\.cn|\.tj\.cn|\.cq\.cn|\.he\.cn|\.nm\.cn|\.ln\.cn|\.jl\.cn|\.hl\.cn|\.js\.cn|\.zj\.cn|\.ah\.cn|\.gd\.cn|\.gx\.cn|\.hi\.cn|\.sc\.cn|\.gz\.cn|\.yn\.cn|\.xz\.cn|\.sn\.cn|\.gs\.cn|\.qh\.cn|\.nx\.cn|\.xj\.cn|\.tw\.cn|\.hk\.cn|\.mo\.cn|\.cn|\.cx|\.cz|\.de|\.dk|\.fo|\.com\.ec|\.tm\.fr|\.com\.fr|\.asso\.fr|\.presse\.fr|\.fr|\.gf|\.gs|\.co\.il|\.net\.il|\.ac\.il|\.k12\.il|\.gov\.il|\.muni\.il|\.ac\.in|\.co\.in|\.org\.in|\.ernet\.in|\.gov\.in|\.net\.in|\.res\.in|\.is|\.it|\.ac\.jp|\.co\.jp|\.go\.jp|\.or\.jp|\.ne\.jp|\.ac\.kr|\.co\.kr|\.go\.kr|\.ne\.kr|\.nm\.kr|\.or\.kr|\.li|\.lt|\.lu|\.asso\.mc|\.tm\.mc|\.com\.mm|\.org\.mm|\.net\.mm|\.edu\.mm|\.gov\.mm|\.ms|\.nl|\.no|\.nu|\.pl|\.ro|\.org\.ro|\.store\.ro|\.tm\.ro|\.firm\.ro|\.www\.ro|\.arts\.ro|\.rec\.ro|\.info\.ro|\.nom\.ro|\.nt\.ro|\.se|\.si|\.com\.sg|\.org\.sg|\.net\.sg|\.gov\.sg|\.sk|\.st|\.tf|\.ac\.th|\.co\.th|\.go\.th|\.mi\.th|\.net\.th|\.or\.th|\.tm|\.to|\.com\.tr|\.edu\.tr|\.gov\.tr|\.k12\.tr|\.net\.tr|\.org\.tr|\.com\.tw|\.org\.tw|\.net\.tw|\.ac\.uk|\.uk\.com|\.uk\.net|\.gb\.com|\.gb\.net|\.vg|\.sh|\.kz|\.ch|\.info|\.ua|\.gov|\.name|\.pro|\.ie|\.hk|\.com\.hk|\.org\.hk|\.net\.hk|\.edu\.hk|\.us|\.tk|\.cd|\.by|\.ad|\.lv|\.eu\.lv|\.bz|\.es|\.jp|\.cl|\.ag|\.mobi|\.eu|\.co\.nz|\.org\.nz|\.net\.nz|\.maori\.nz|\.iwi\.nz|\.io|\.la|\.md|\.sc|\.sg|\.vc|\.tw|\.travel|\.my|\.se|\.tv|\.pt|\.com\.pt|\.edu\.pt|\.asia|\.fi|\.com\.ve|\.net\.ve|\.fi|\.org\.ve|\.web\.ve|\.info\.ve|\.co\.ve|\.tel|\.im|\.gr|\.ru|\.net\.ru|\.org\.ru|\.hr|\.com\.hr)$/, '$1'); 
} 

主要是我只是想刪除所有子域名,可惜這不是一些新的頂級域名的100%,但它工作得很好,你可以隨時添加到正則表達式。

http://jsfiddle.net/icodeforlove/TzjJE/2/

2
var docdomain = document.domain.split('.'); 
var dom1 = ""; 
if (typeof (docdomain[docdomain.length - 2]) != 'undefined') dom1 = docdomain[docdomain.length - 2] + '.'; 
var domain = dom1 + docdomain[docdomain.length - 1]; 
console.log(domain); 

//without subdomains 
+1

你應該在你的回答中添加一些解釋/描述來幫助發佈。 –

7

我一直在尋找的東西會在大多數情況下工作,而無需維護TLD列表(並跳過它的大小!)。在我看來,您可以通過,而不是着眼於二級域名爲常見的相當準確地做到這一點:

function getDomainName(domain) { 
    var parts = domain.split('.').reverse(); 
    var cnt = parts.length; 
    if (cnt >= 3) { 
     // see if the second level domain is a common SLD. 
     if (parts[1].match(/^(com|edu|gov|net|mil|org|nom|co|name|info|biz)$/i)) { 
      return parts[2] + '.' + parts[1] + '.' + parts[0]; 
     } 
    } 
    return parts[1]+'.'+parts[0]; 
} 

小提琴&測試@http://jsfiddle.net/mZPaf/2/

批評/想法歡迎。

+0

'www.gov.com','www.edu.com'和類似的域名都失敗了。 –

+0

是的 - 當然不完美,但足夠我的情況。我想你可以檢查零件[0]也不是一個普通的SLD – AcidPAT

1

沒有TLD的完整列表(這會變得很長)。如果你只需要該域名從當前頁面,您可以使用我的技術(使用cookie來找到根域)

Javascript - Get Domain Name Excluding Subdomain

要刪除擴展,然後你可以使用的第一個元素從str.split('.')[0]

+0

這是一個很好的解決方案,涵蓋了很多角落案例。你可以使用代碼示例來格式化你的答案,並且可以回答問題嗎?之後,這個答案可以被接受。 – terales

+0

此外,它缺乏一些解釋,它可能不適合嵌入的iframe的腳本工作:https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy – terales

0

在上面給出的其他朋友的代碼示例的幫助下,我創建了一個函數,它將只返回域名,如果它不是有效的域名,例如TLD丟失,那麼它會按照我的要求附加「.com」。

function getDomain(url){ 

var TLDs = ["ac", "ad", "ae", "aero", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "biz", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cat", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "com", "coop", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "edu", "ee", "eg", "er", "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "info", "int", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo", "mobi", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx", "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sy", "sz", "tc", "td", "tel", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tp", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "xn--0zwm56d", "xn--11b5bs3a9aj6g", "xn--3e0b707e", "xn--45brj9c", "xn--80akhbyknj4f", "xn--90a3ac", "xn--9t4b11yi5a", "xn--clchc0ea0b2g2a9gcd", "xn--deba0ad", "xn--fiqs8s", "xn--fiqz9s", "xn--fpcrj9c3d", "xn--fzc2c9e2c", "xn--g6w251d", "xn--gecrj9c", "xn--h2brj9c", "xn--hgbk6aj7f53bba", "xn--hlcj6aya9esc7a", "xn--j6w193g", "xn--jxalpdlp", "xn--kgbechtv", "xn--kprw13d", "xn--kpry57d", "xn--lgbbat1ad8j", "xn--mgbaam7a8h", "xn--mgbayh7gpa", "xn--mgbbh1a71e", "xn--mgbc0a9azcg", "xn--mgberp4a5d4ar", "xn--o3cw4h", "xn--ogbpf8fl", "xn--p1ai", "xn--pgbs0dh", "xn--s9brj9c", "xn--wgbh1c", "xn--wgbl6a", "xn--xkc2al3hye2a", "xn--xkc2dl3a5ee0h", "xn--yfro4i67o", "xn--ygbi2ammx", "xn--zckzah", "xxx", "ye", "yt", "za", "zm", "zw"].join() 

    url = url.replace(/.*?:\/\//g, ""); 
    url = url.replace(/www./g, ""); 
    var parts = url.split('/'); 
    url = parts[0]; 
    var parts = url.split('.'); 
    if (parts[0] === 'www' && parts[1] !== 'com'){ 
     parts.shift() 
    } 
    var ln = parts.length 
     , i = ln 
     , minLength = parts[parts.length-1].length 
     , part 

    // iterate backwards 
    while(part = parts[--i]){ 
     // stop when we find a non-TLD part 
     if (i === 0     // 'asia.com' (last remaining must be the SLD) 
      || i < ln-2    // TLDs only span 2 levels 
      || part.length < minLength // 'www.cn.com' (valid TLD as second-level domain) 
      || TLDs.indexOf(part) < 0 // officialy not a TLD 
     ){ 
      var actual_domain = part; 
      break; 
      //return part 
     } 
    } 
    //console.log(actual_domain); 
    var tid ; 
    if(typeof parts[ln-1] != 'undefined' && TLDs.indexOf(parts[ln-1]) >= 0) 
    { 
     tid = '.'+parts[ln-1]; 
    } 
    if(typeof parts[ln-2] != 'undefined' && TLDs.indexOf(parts[ln-2]) >= 0) 
    { 
     tid = '.'+parts[ln-2]+tid; 
    } 
    if(typeof tid != 'undefined') 
     actual_domain = actual_domain+tid; 
    else 
     actual_domain = actual_domain+'.com'; 


    return actual_domain; 
} 
-1
function getDomainName(hostname) { 
    var TLDs = new RegExp(/\.(com|net|org|biz|ltd|plc|edu|mil|asn|adm|adv|arq|art|bio|cng|cnt|ecn|eng|esp|etc|eti|fot|fst|g12|ind|inf|jor|lel|med|nom|ntr|odo|ppg|pro|psc|psi|rec|slg|tmp|tur|vet|zlg|asso|presse|k12|gov|muni|ernet|res|store|firm|arts|info|mobi|maori|iwi|travel|asia|web|tel)(\.[a-z]{2,3})?$|(\.[^\.]{2,3})(\.[^\.]{2,3})$|(\.[^\.]{2})$/); 
    return hostname.replace(TLDs, '').split('.').pop(); 
} 

/* TEST */ 

var domains = [ 
    'domain.com', 
    'subdomain.domain.com', 
    'www.subdomain.domain.com', 
    'www.subdomain.domain.info', 
    'www.subdomain.domain.info.xx', 
    'mail.subdomain.domain.co.uk', 
    'mail.subdomain.domain.xxx.yy', 
    'mail.subdomain.domain.xx.yyy', 
    'mail.subdomain.domain.xx', 
    'domain.xx' 
]; 

var result = []; 
for (var i = 0; i < domains.length; i++) { 
    result.push(getDomainName(domains[i])); 
} 

alert (result.join(' | ')); 
// result: domain | domain | domain | domain | domain | domain | domain | domain | domain | domain 
-1

這個怎麼樣?

function getDomain(){ 
     if(document.domain.length){ 
      var parts = document.domain.replace(/^(www\.)/,"").split('.'); 

      //is there a subdomain? 
      while(parts.length > 2){ 
       //removing it from our array 
       var subdomain = parts.shift(); 
      } 

      //getting the remaining 2 elements 
      var domain = parts.join('.'); 

      return domain.replace(/(^\.*)|(\.*$)/g, ""); 
     } 
     return ''; 
    } 
+0

不www.google工作。 co.uk例如 –

+0

co.uk將在這種情況下的域名:) – Alvaro

+0

但我希望這是花了google.co.uk –

-1

正則表達式我用得到的域名只有:([^.]*[.]){0,}([^.]*)(\.[^.]*) 您可以在第二部分中被發現。

+0

失敗'www.example.co.uk'。第二部分是'合作' – Quentin