silicoid

Рейтинг
171
Регистрация
13.10.2014
вот такой кодэ получается, с учетом пары костылей.
        
        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"

а на счет "sub1" так в этом как раз и суть задачи. Выловить только самый нижний поддомен в списке.
если бы нужно было отловить все поддомены , то это тоже решаемо, но методика будет немного другая

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

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

на

$url = ltrim( pathinfo( strtolower( $url ),  PATHINFO_BASENAME ), 'www.' );
и всё заколосится 

Смотрите. Вы сейчас более-менее пересказали идеологию PWA ( progressive web app )
Очень интересная тема.  Я ее начал прорабатывать для сайтов компании в конце 19 года, а потом случился ковид со всеми вытекающими последствиями.

Но если мы берем чисто-технологический вопрос, то как мне кажется тема очень интересная и перспективная. Разумеется с поправкой на то, что все интересные и прогрессивные технологии пробиваются на рынок года через 3-4 после появления.

еще пришла мысля для удаления 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;

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

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

тем, что это способ разбить путь на составляющие, а не получить его

какую переменную вы туда вкорячите зависит от вашего воображения.
только в той переменной должен быть валидный http адрес, иначе вернет пустую строку

апд.
разумеется, если в качестве источника мы берем $_SERVER, то проще использовать 'HTTP_HOST'
но это может быть не всегда. например, если url вводится руками пользователя в форме


зы2.

прошу прощения за кучу правок.
Самочувствие не очень, сижу на колёсах.

апд.
если решать задачу "в лоб" а не красиво, то будет что-то подобное.
приведение к нижнему регистру сделано для того, что parse_url работает как есть. То-есть вываливает имя в том виде, в каком его получает на входе, независимо от регистра.
        $first_sub = explode('.', parse_url ( 'https://WwW.mySubDomain.mYsITe.COM',  PHP_URL_HOST ));
        if (strtolower ($first_sub[0]) == 'www'){
                $subdomain = strtolower ( $first_sub[1] );
        } else {
                $subdomain = strtolower ( $first_sub[0] );
        }
        echo $subdomain;

как дети малые. чесслово

echo explode('.', parse_url ( 'https://my.site.com',  PHP_URL_HOST ))[0]

это без www
с www добавляете проверку на www

Надо было сделать быстро - сделали быстро.
какая разница на чем сайт, главное полезен он или нет.

это школьникам важно, какие технологии используются, чтоб похвастаться перед друзьями, а в крупном бизнесе другие критерии качества сайта.

Всего: 1685