2011-11-24 30 views
8

Tôi muốn nhận tên miền chỉ bằng javascript. ExLàm thế nào để có được tên miền chỉ sử dụng javascript?

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

Cảm ơn bạn!

Chỉnh sửa: "tên miền" = tên miền không có phần mở rộng (ví dụ: .com, .net, .co.uk ...) và không có tên miền phụ (ví dụ: www, email, cdn, support ...)

+0

Điều này có cần phải hoạt động trên tất cả các miền không? Và nếu không, bạn đang làm việc với những loại miền nào? ('subd.subd.domain.com',' domain.com', 'http: // domain.com', v.v.) – Purag

+0

Định nghĩa của bạn về" [domain] (http://en.wikipedia.org/ là gì wiki/Domain_name) "? – RobG

+0

Điều này có giúp ích cho bạn không? http://jsfiddle.net/purmou/TzjJE/ – Purag

Trả lời

27

Sử dụng location.host và cắt đứt các tên miền phụ và TLD:

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

cập nhật: như @demix chỉ ra, điều này không cho 2 và 3 chữ tên miền. Nó cũng sẽ không hoạt động đối với các miền như aero, jobs và hàng tá tên miền khác.

Cách duy nhất xung quanh là biết TLD hợp lệ trước, vì vậy đây là một chức năng thích hợp hơn:

// 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) 

Tôi hy vọng tôi đã không bỏ lỡ quá nhiều trường hợp góc. Điều này sẽ có sẵn trong các đối tượng location :(

trường hợp thử nghiệm: http://jsfiddle.net/hqBKd/4/

Một danh sách các tên miền cấp cao có thể được tìm thấy ở đây: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

+1

sẽ không hoạt động chính xác nếu miền là _ccc.abc.cn_ – demix

+0

@demix oops. sẽ phải xác nhận TLD:/ –

+0

Điều này sẽ làm việc trong các ví dụ được đưa ra trong câu hỏi nhưng như demix cho biết sẽ thất bại trên tên miền với chiều dài tên là 2 và 3, đặc biệt URL rút ngắn miền rơi vào thể loại này. –

-1

Rất đơn giản:

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

Chỉ hoạt động cho 'subdomain.domain.com': http://jsfiddle.net/purmou/Pgarw/ – Purag

+0

Tôi đã thử nghiệm cả hai Và nó hoạt động. Ít nhất là trong FF. Có lẽ một số trình duyệt quirk? – ioseb

+0

Điều này sẽ không hoạt động trên miền với hai cấp độ (như .com.vn & co.uk). Ví dụ, nó sẽ không hoạt động trên vn.search.yahoo.com.vn, nó sẽ cho 'com' thay vì 'yahoo'. xem http://jsfiddle.net/gagan/SLeKQ/ –

1

Cách duy nhất tôi có thể tưởng tượng là danh sách Mẫu mã tất cả các TLD. như dưới đây.

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 nên làm một số sửa chữa trong IE.

0

i neede d để làm điều này và whipped lên một cái gì đó đơn giản mà chiếm đối với trường hợp sử dụng của tôi

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'); 
} 

chủ yếu tôi chỉ muốn loại bỏ tất cả các tên miền phụ, không may đây không phải là 100% đối với một số các TLD mới nhưng nó hoạt động khá tốt, và bạn luôn có thể thêm vào regex.

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

Bạn nên thêm một số giải thích/mô tả xung quanh câu trả lời của bạn để giúp áp phích. –

7

tôi đang tìm kiếm cái gì đó sẽ làm việc cho phần lớn các trường hợp, mà không cần phải duy trì danh sách TLD (và bỏ qua kích thước của nó!). Dường như với tôi rằng bạn có thể làm được điều này khá chính xác bằng cách nhìn thay vì ở cấp Thứ hai miền cho những người chung:

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]; 
} 

Fiddle & thử nghiệm @http://jsfiddle.net/mZPaf/2/

Phê Bình/suy nghĩ hoan nghênh.

+0

'www.gov.com',' www.edu.com' và các miền tương tự đều không thành công. –

+0

Có - không hoàn hảo chắc chắn nhưng đủ cho các trường hợp của tôi. Tôi cho rằng bạn có thể kiểm tra các bộ phận [0] cũng không phải là SLD phổ biến – AcidPAT

1

Nếu không có danh sách đầy đủ các TLD (sẽ rất dài).Nếu bạn chỉ cần tên miền từ trang hiện tại bạn có thể sử dụng kỹ thuật của tôi (sử dụng cookie để tìm tên miền gốc)

Javascript - Get Domain Name Excluding Subdomain

Để loại bỏ phần mở rộng sau đó bạn có thể sử dụng các yếu tố đầu tiên từ một str.split('.')[0]

+0

Đây là giải pháp tuyệt vời bao gồm rất nhiều trường hợp góc. Bạn có thể định dạng câu trả lời của mình bằng ví dụ mã và bổ sung để trả lời câu hỏi không? Sau đó câu trả lời này có thể được chấp nhận. – terales

+0

Ngoài ra, thiếu một số giải thích rằng nó có thể không hoạt động đối với các tập lệnh được nhúng bằng iframe: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy – terales

0

Với sự giúp đỡ của các ví dụ mã của người bạn khác đã nêu ở trên, tôi đã tạo một hàm chỉ trả về tên miền và nếu đó không phải là miền hợp lệ, ví dụ TLD bị thiếu thì nó sẽ đính kèm ".com" theo yêu cầu của tôi.

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

gì về điều này?

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

không hoạt động với www.google. co.uk ví dụ: –

+0

co.uk sẽ là tên miền trong trường hợp đó :) – Alvaro

+0

nhưng tôi hy vọng nó sẽ là google.co.uk –

-1

RegEx tôi sử dụng để có được tên miền chỉ: ([^.]*[.]){0,}([^.]*)(\.[^.]*) Tên miền có thể được tìm thấy trong phần thứ hai.

+0

Không có trên 'www.example.co.uk'. Phần thứ hai là 'co' – Quentin

Các vấn đề liên quan