получить сабдомен в php

12
S
На сайте с 13.10.2014
Offline
171
#11

Евгений Крупченко, у вашего способа, есть один крупный недостаток. Домен должен быть известен.
Если он неизвестен, придется сначала выловить собсно домен, а потом уже начинать шаманить.
представьте простой случай, когда пользователь вводит url в форму.

меня, кстати, смущает вопрос, как подобные варианты будут работать на сайтах url-ами в паникоде. Вроде xn--b1afnsoec8e.xn--d1acufc.xn--p1ai
хотя тут тоже используется точка - разделитель. то-есть должно быть нормально

S
На сайте с 13.10.2014
Offline
171
#12
еще пришла мысля для удаления www использовать ltrim
// приводим URL к типовому представлению
// выкидываем www, если есть
$url = 'https://wWW.SomeUrl.domain.myhost.com';
$url = ltrim( parse_url( strtolower($url),  PHP_URL_HOST ), 'www.' );
        
//разделяем на составляющие и выбираем первое значение
//подобная конструкция будет работать в php 7.0+
$last_url = explode( '.', $url )[0];
echo $last_url;

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#13

я так и сказал:

а) если имя основного домена нам не дано, то однозначно определить что считать поддоменом невозможно. будут различные трактовки. потому принимаем, что domen.com нам известно и используем его для вычленения поддомена.

если же не известен, то конечно придется доработать.

но повторюсь:

ваше parse_url уже не сработает если искать нужно будет в строке, не начинающейся с http:// или https://

Drinktea :
sub.domen.com 

https://sub.domen.com

возьмите да запустите свой код. почему я это должен делать? :]


и также неизвестно сколько вариантов sub1.sub2.sub3.domen.com может быть на входе.

потому ваше [0] не подходит т.к. определит лишь sub1

ну и punycode:



S
На сайте с 13.10.2014
Offline
171
#14

Хорошее замечание.
но это не проблема. просто замените

$url = ltrim( parse_url( strtolower($url),  PHP_URL_HOST ), 'www.' );

на

$url = ltrim( pathinfo( strtolower( $url ),  PATHINFO_BASENAME ), 'www.' );
и всё заколосится 
S
На сайте с 13.10.2014
Offline
171
#15
а на счет "sub1" так в этом как раз и суть задачи. Выловить только самый нижний поддомен в списке.
если бы нужно было отловить все поддомены , то это тоже решаемо, но методика будет немного другая

D
На сайте с 01.01.2016
Offline
43
#16

скрипт будет на моем домене(ах), но, нужно чтобы не приходилось каждый раз задавать заранее известный домен, нужно будто он неизвестен - для универсальности.

Плюс еще домен может быть с /page2.phph или например /category/2/page1.php .

я вот нарыл такой код

$url = array(
    'http://www.domain.com', // www
    'http://domain.com', // --nothing--
    'https://domain.com', // --nothing--
    'www.domain.com', // www
    'domain.com', // --nothing--
    'www.domain.com/some/path', // www
    'http://sub.domain.com/domain.com', // sub
    'опубликованному.значения.ua', // опубликованному ;)
    'значения.ua', // --nothing--
    'http://sub-domain.domain.net/domain.net', // sub-domain
    'sub-domain.third-Level_DomaIN.domain.uk.co/domain.net' // sub-domain
);

foreach ($url as $u) {
    preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $u, $match);
    var_dump($match);
}

но тут заранее известный пул а нужно прям с текущего урла

плюс домен будет с 1 уровнем "поддоменности"

Пусто...
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#17

тогда вот вам еще проблема с ltrim:


предположим поддомен этот будет с буквой w как и отрезаемый www.


получили someurl, а не wsomeurl


насчет sub1 - ладно уж. мы не знаем что там у ТС на входе может быть. потому нет смысла гадать.

если только 1 уровень поддоменов, то ваш вариант сгодится.

H2
На сайте с 18.04.2011
Offline
72
#18


$ex=explode('.', $_SERVER['HTTP_HOST'] );
if((count($ex)>2)&&($ex[0]!=='www')) echo $ex[0];

выводит только суб без всего остального

S
На сайте с 13.10.2014
Offline
171
#19
вот такой кодэ получается, с учетом пары костылей.
        
        function get_last_subdomain($url)
        {
                //приводим строку к нижнему регистру, а то мало ли...
                $url = trim(strtolower($url));
                
                //проверяем наличие http(s)
                //это сделано как костыль, чтоб parse_url сработал корректно
                $scheme_entry = preg_match('/^(http|https)/i', $url);
                if ($scheme_entry == 0){
                        $url = 'http://' . $url;
                }
                
                //выпиливаем www и парсим
                $url_parsed = parse_url($url, PHP_URL_HOST);
                $url_parsed = preg_replace('/^www\./i','', $url_parsed);
                $url_exploded = explode('.', $url_parsed );
                
                //проверяем кол-во элементов в массиве
                //если 2 и меньше отдаем FALSE ( нет поддомена ) если больше отдаем первое
                if ( sizeof($url_exploded) <=2 )
                {
                        return FALSE;
                }
                else
                {
                        return $url_exploded[0];
                }
        
                return NULL;    
        }
        
        
        
        $pool = array(
                'http://www.domain.com', // www
                'http://domain.com', // --nothing--
                'https://domain.com', // --nothing--
                'www.domain.com', // www
                'domain.com', // --nothing--
                'www.wadomain.com/some/path', // www
                'http://sub.domain.com/domain.com', // sub
                'опубликованному.значения.ua', // опубликованному ;)
                'значения.ua', // --nothing--
                'http://sub-domain.domain.net/domain.net', // sub-domain
                'sub-domain.third-Level_DomaIN.domain.uk.co/domain.net' // sub-domain
        );
        
        
        foreach($pool as $url)
        {
                echo $url.' -> ';
                var_dump(get_last_subdomain($url));
        }
        
Наверняка можно сделать красивее, но код получился вполне рабочий
http://www.domain.com -> bool(false)
http://domain.com -> bool(false)
https://domain.com -> bool(false)
www.domain.com -> bool(false)
domain.com -> bool(false)
www.wadomain.com/some/path -> bool(false)
http://sub.domain.com/domain.com -> string(3) "sub"
опубликованному.значения.ua -> string(30) "опубликованному"
значения.ua -> bool(false)
http://sub-domain.domain.net/domain.net -> string(10) "sub-domain"
sub-domain.third-Level_DomaIN.domain.uk.co/domain.net -> string(10) "sub-domain"

Д
На сайте с 01.04.2012
Offline
156
#20
function getSubDomain($data) {
$tmp = parse_url($data);
$tmp =  str_replace('www.', '', $tmp);          
$tmp = explode('.', $tmp['host']);
$tmp = array_slice($tmp, 0, -2);
$str = implode(".", $tmp);
return $str;
}



echo getSubDomain('http://www.sub.domen.com'); // sub
echo getSubDomain('http://sub.domen.com'); // sub
echo getSubDomain('https://www.sub.domen.com'); // sub
echo getSubDomain('https://sub.domen.com'); // sub
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий