2016-03-08 3 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) I на самом деле рассмотрит 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.uk, co.in и т.д.) и фильтровать те, затем перейдите к что сейчас считается основным доменным именем и пропустить это. Если, наконец, что-то есть в индексе, который мы определили, и он не соответствует «www», вы его возвращаете.

Это всего лишь пример, показывающий вам, насколько сложным является ваш вопрос, поскольку для этого потребуется обновленный (как в активно поддерживаемом, кураторском) списке «домен второго уровня», иначе вы можете не работать ,

Единственное, что я на самом деле принимал во внимание, это то, что some.deep.nested.sub.domain.com предоставит вам sub вместо some.

(Также обратите внимание, что я не запрещал вообще запрещать сопоставление ip, так как это происходит в соответствии с правилом 2x2).


Мне очень любопытно о проблеме, которую вы пытаетесь решить, пытаясь изолировать субдомен, так как оно само по себе не имеет никакого смысла. Я могу подумать о ситуациях, когда вы хотите отобразить «никнейм» сортов на основе субдомена, но потом я заново узнаю, какие шаблоны ожидать. С технической точки зрения наличие только субдомена было бы бесполезным.

+0

Спасибо ... это то, что я искал – user850234

+0

@ user850234, пожалуйста, рассмотрите все проблемы, которые я поднял в ответ, они могут не применяться сейчас, но в конечном итоге технология имеет неприятную привычку улавливать вас от страха. –

+0

Да ... Я принимал все это во внимание ... ситуация, которую я пытаюсь решить, заключается в том, что в моем приложении есть несколько логинов поддоменов, которые пользовательский интерфейс должен извлечь из 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/

Смежные вопросы