从主机名中提取子域

时间:2016-03-08 08:19:32

标签: javascript

我想要一种从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

仅针对上述情况,我需要处理。我不期待任何更多。最重要的是,我不需要提取任何嵌套的子域名,只有第一级子域名就足够了。

这方面的任何想法都会有所帮助。

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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.*$

答案 2 :(得分:0)

我个人认为www是一个子域名,如果是“二级”域名(.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

这样做的原因是应用了一个非常生硬的规则,即'二级'域总是由2x2个字符(co.ukco.in等组成)并过滤那些,然后跳到现在被认为是主要域名并跳过它。如果我们已经确定了索引上的某些内容并且它与“www”不匹配,则会将其恢复。

这只是一个例子,向您展示您的问题有多难,因为它需要一个最新的(如积极维护,策划)“二级”域名列表,否则您可能会失败。

我实际上唯一考虑的是some.deep.nested.sub.domain.com会给你sub而不是some

(另请注意,我没有主动阻止ip匹配,它恰好符合2x2规则)。

我非常好奇您试图通过尝试隔离子域来解决的问题,因为它本身没有任何意义。我可以想到你想根据一个子域显示各种各样的“昵称”的情况,但我会知道你会知道所期望的模式。从技术角度来看,只拥有子域是没用的。