У вас есть URL-адрес в виде строки, хранящейся в переменной, или откуда этот URL-адрес? В каком контексте? Пожалуйста, дополните.
Felix Kling
Не могли бы вы использовать регулярное выражение, которое делает что-то вроде (^|://)(.*)\.и захватывает .*? Я скорее отстой и с php, и с регулярным выражением, но это приходит на ум.
corsiKa
Что он должен получить en.foo.bar.example.comили en.example.co.uk?
@Mike Lewis - Решает ли это проблему нескольких поддоменов, таких как usa.en.example.com? Просто интересно (кстати, мой собственный ответ - нет).
Джаред Фарриш,
@Jared, только что добавил решение для обнаружения нескольких поддоменов.
Майк Льюис,
1
@Mike - Будет ли это работать с tx.usa.en.example.com? (или science.news.bbc.co.uk )? (кстати, это не рабочая ссылка, это просто пример, хотя news.bbc.co.uk действительно работает)
Джаред Фарриш,
4
Это работает для всего, что имеет одно «словесное» TLD, например net, com, biz и т. Д. Однако, например, при работе с co.uk это не так. Как видно здесь, это действительно более сложная проблема.
Майк Льюис,
2
это также не удается, если субдомен отсутствует вообще.
raveren 03
32
Вы можете сделать это, сначала получив имя домена (например, sub.example.com => example.co.uk), а затем используя strstr для получения поддоменов.
Это кажется лучшим решением, так как оно также позволяет использовать домены без поддомена, а не повторно использовать доменное имя в качестве поддомена, являющегося частью перед первой точкой. Очень полезно для проверки существования поддомена.
Karl MW
Мне нужно было получить «базовый» домен (без поддомена), и я делал свое собственное решение, взрывая хост и получая последние элементы массива с помощью forцикла, но мне нужно было проверить их длину (чтобы определить, не были частью домена, например co.uk). На самом деле ваше решение намного проще, чем то, что делал я. Regex спасает жизни, спасибо!
Yoone
1
Замечательно ... это так хорошо работает для всех типов доменов и поддоменов ... хорошо.
jon
2
хотя это решение очень удобное и может работать почти во всех случаях, имейте в виду, что имена доменов могут содержать более 6 символов, например pvt.k12.ma.us, health.vnили даже k12.ak.us. Кроме того, имена доменов могут использовать китайский или русский набор символов, поэтому часть регулярного выражения [a-z\.]{2,6}не будет соответствовать им. Посмотрите здесь, чтобы получить пример имени домена: publicsuffix.org/list
Поскольку единственным надежным источником суффиксов домена являются регистраторы доменов, вы не можете найти субдомен без их ведома. На https://publicsuffix.org есть список со всеми суффиксами доменов . Этот сайт также ссылается на библиотеку PHP: https://github.com/jeremykendall/php-domain-parser .
Пожалуйста, найдите пример ниже. Я также добавил образец для en.test.co.uk, который является доменом с мультисуффиксом (co.uk).
PS - понятия не имею, что написано в русском тексте. Просто взял несколько случайных слов с ru.wikipedia.org ;)
Kamafeather
Разве это не украинское? .uaэто код страны для Украины.
nalply
Нет. Просто смешанная информация. Но я не уверен, я недостаточно хорош, чтобы их различать;)
Kamafeather
3
Что касается русского, то гугл-перевод с русского на английский возвращается как «опубликованные значения» (на случай, если кому-то было любопытно, как и мне)
Джереми Харрис
@Kamafeather, это выглядит пуленепробиваемым. Есть ли способ просто получить $match[1]роль? $match[0]кажется ненужным.
Andres SK
3
$REFERRER = $_SERVER['HTTP_REFERER'];// Or other method to get a URL for decomposition
$domain = substr($REFERRER, strpos($REFERRER,'://')+3);
$domain = substr($domain,0, strpos($domain,'/'));// This line will return 'en' of 'en.example.com'
$subdomain = substr($domain,0, strpos($domain,'.'));
Есть более эффективные способы автоматического определения текущего хоста (например, $_SERVER['HTTP_HOST']), а затем полагаться на поддельный заголовок реферера, предполагая, что это основная идея ответа.
Мэтью
Верно, я использовал старый фрагмент кода. Однако пример все еще актуален. Не в этом корень вопроса.
Джаред Фарриш,
Чтобы добавить к этим комментариям выше, использование $ _SERVER ['HTTP_HOST'] может быть неэффективным, поскольку есть вероятность, что он не может быть установлен.
gmslzr
2
PHP 7.0: Использование функции разнесения и создание списка всех результатов.
На самом деле не существует 100% динамического решения - я просто пытался понять это, и из-за различных расширений домена (DTL) эта задача была бы действительно сложной без фактического анализа всех этих расширений и проверки их каждый раз:
.com vs .co.uk vs org.uk
Самый надежный вариант - определить константу (или запись в базе данных и т. Д.), Которая хранит фактическое доменное имя, и удалить ее из $_SERVER['SERVER_NAME']использования.substr()
Теперь, если вы используете эту функцию, http://test.mymaindomain.co.ukона даст вам testили, если у вас есть несколько уровней поддоменов, http://another.test.mymaindomain.co.ukвы получите another.test- если, конечно, вы не обновите DOMAIN.
Использование регулярного выражения, строковых функций, parse_url () или их комбинаций не является реальным решением. Просто протестируйте любое из предложенных решений с доменом test.en.example.co.uk, правильного результата не будет.
// For www.abc.en.example.com
$host_Array = explode(".",$_SERVER['HTTP_HOST']);// Get HOST as array www, abc, en, example, com
array_pop($host_Array); array_pop($host_Array);// Remove com and exmaple
array_shift($host_Array);// Remove www (Optional)
echo implode($host_Array,".");// Combine array abc.en
Я отрезал подстроку с 12 вместо 11, потому что подстроки начинаются с 1 для второго параметра. Итак, теперь, если вы ввели test.example.com, значение $subdomainбудет test.
Это лучше, чем использование, explodeпотому что, если в субдомене есть ., это не отключит его.
Это будет работать, только если wwwв начале строки нет. Слишком банальный подход.
FooBar
Это упростит жизнь другим разработчикам в команде, я бы предпочел использовать это, чем какой-нибудь продвинутый рег. Если вы хотите обрезать www, используйте trim ($ s, 'www'); или просто приспособьте его к своей бизнес-логике ...
тасманиски
1
Для полноты картины wwwэто фактически субдомен. Это просто псевдоним самого доменного имени по историческим причинам.
Мы используем эту функцию для обработки нескольких поддоменов, а несколько tld также обрабатывают ip и localhost
function analyse_host($_host){
$my_host = explode('.', $_host);
$my_result =['subdomain'=>null,'root'=>null,'tld'=>null];// if host is ip, only set as rootif(filter_var($_host, FILTER_VALIDATE_IP)){// something like 127.0.0.5
$my_result['root']= $_host;}
elseif(count($my_host)===1){// something like localhost
$my_result['root']= $_host;}
elseif(count($my_host)===2){// like jibres.com
$my_result['root']= $my_host[0];
$my_result['tld']= $my_host[1];}
elseif(count($my_host)>=3){// some conditons like// ermile.ac.ir// ermile.jibres.com// ermile.jibres.ac.ir// a.ermile.jibres.ac.ir// get last one as tld
$my_result['tld']=end($my_host);
array_pop($my_host);// check last one after remove is probably tld or not
$known_tld =['com','org','net','gov','co','ac','id','sch','biz'];
$probably_tld =end($my_host);if(in_array($probably_tld, $known_tld)){
$my_result['tld']= $probably_tld.'.'. $my_result['tld'];
array_pop($my_host);}
$my_result['root']=end($my_host);
array_pop($my_host);// all remain is subdomainif(count($my_host)>0){
$my_result['subdomain']= implode('.', $my_host);}}return $my_result;}
Что если в начале есть обработчик протокола, например http: //, https: //, ftp: // и т. Д.? ;)
Джаред Фарриш
@ Джаред, в строке, которую он хочет проанализировать, нет протокола ... Но если бы он был, я бы использовал parse_url()для извлечения хоста.
Мэтью
Итак, мы предоставили два подхода, которые будут уместны в разных контекстах.
Джаред Фарриш,
В основном, я просто рад, что кто-то не опубликовал ответ регулярного выражения (пока). Не говоря уже о том, что последняя строка моего ответа выполняет то же самое, что и ваш.
(^|://)(.*)\.
и захватывает.*
? Я скорее отстой и с php, и с регулярным выражением, но это приходит на ум.en.foo.bar.example.com
илиen.example.co.uk
?Ответы:
Вот однострочное решение:
Или используя ваш пример:
РЕДАКТИРОВАТЬ: Исправлено «только переменные должны передаваться по ссылке» путем добавления двойных скобок.
РЕДАКТИРОВАТЬ 2 : Начиная с PHP 5.4 вы можете просто сделать:
источник
explode(...)[0]
наши дни вы не можете просто работать вместо смены? Не занимается PHP уже несколько лет ..Strict Standards: Only variables should be passed by reference.
www.en.example.com
и вернетсяwww
как поддомен.Использует функцию parse_url .
Для нескольких поддоменов
источник
Вы можете сделать это, сначала получив имя домена (например, sub.example.com => example.co.uk), а затем используя strstr для получения поддоменов.
Выходы:
источник
for
цикла, но мне нужно было проверить их длину (чтобы определить, не были частью домена, например co.uk). На самом деле ваше решение намного проще, чем то, что делал я. Regex спасает жизни, спасибо!pvt.k12.ma.us
,health.vn
или дажеk12.ak.us
. Кроме того, имена доменов могут использовать китайский или русский набор символов, поэтому часть регулярного выражения[a-z\.]{2,6}
не будет соответствовать им. Посмотрите здесь, чтобы получить пример имени домена: publicsuffix.org/listhttp://php.net/parse_url
источник
Поскольку единственным надежным источником суффиксов домена являются регистраторы доменов, вы не можете найти субдомен без их ведома. На https://publicsuffix.org есть список со всеми суффиксами доменов . Этот сайт также ссылается на библиотеку PHP: https://github.com/jeremykendall/php-domain-parser .
Пожалуйста, найдите пример ниже. Я также добавил образец для en.test.co.uk, который является доменом с мультисуффиксом (co.uk).
источник
Самое простое и быстрое решение.
источник
Просто...
Просто прочтите $ match [1]
Рабочий пример
Он отлично работает с этим списком URL-адресов
источник
.ua
это код страны для Украины.$match[1]
роль?$match[0]
кажется ненужным.источник
$_SERVER['HTTP_HOST']
), а затем полагаться на поддельный заголовок реферера, предполагая, что это основная идея ответа.PHP 7.0: Использование функции разнесения и создание списка всех результатов.
Пример: sub.domain.com
Результат: sub
Результат: домен
источник
.co.uk
- ваш фрагмент не будет работать с этими TLDЯ нашел лучшее и краткое решение:
источник
Для тех, кто получил сообщение «Ошибка: строгие стандарты: только переменные должны передаваться по ссылке». Используйте так:
$env = (explode(".",$_SERVER['HTTP_HOST'])); $env = array_shift($env);
источник
Как видно из предыдущего вопроса: как получить первый поддомен с помощью PHP?
источник
На самом деле не существует 100% динамического решения - я просто пытался понять это, и из-за различных расширений домена (DTL) эта задача была бы действительно сложной без фактического анализа всех этих расширений и проверки их каждый раз:
.com vs .co.uk vs org.uk
Самый надежный вариант - определить константу (или запись в базе данных и т. Д.), Которая хранит фактическое доменное имя, и удалить ее из
$_SERVER['SERVER_NAME']
использования.substr()
Теперь, если вы используете эту функцию,
http://test.mymaindomain.co.uk
она даст вамtest
или, если у вас есть несколько уровней поддоменов,http://another.test.mymaindomain.co.uk
вы получитеanother.test
- если, конечно, вы не обновитеDOMAIN
.Надеюсь, это поможет.
источник
Просто
reset(explode(".", $_SERVER['HTTP_HOST']))
источник
Использование регулярного выражения, строковых функций, parse_url () или их комбинаций не является реальным решением. Просто протестируйте любое из предложенных решений с доменом
test.en.example.co.uk
, правильного результата не будет.Правильное решение - использовать пакет, который анализирует домен с помощью списка общедоступных суффиксов . Я рекомендую TLDExtract , вот пример кода:
источник
это мое решение, оно работает с наиболее распространенными доменами, вы можете подогнать массив расширений по своему усмотрению:
источник
источник
Я знаю, что очень опаздываю на игру, но начнем.
Я взял переменную сервера HTTP_HOST (
$_SERVER['HTTP_HOST']
) и количество букв в домене (так чтоexample.com
это было бы 11).Затем я использовал
substr
функцию, чтобы получить поддомен. я сделалЯ отрезал подстроку с 12 вместо 11, потому что подстроки начинаются с 1 для второго параметра. Итак, теперь, если вы ввели test.example.com, значение
$subdomain
будетtest
.Это лучше, чем использование,
explode
потому что, если в субдомене есть.
, это не отключит его.источник
если вы используете drupal 7
это поможет вам:
источник
источник
Начиная с PHP 5.3 вы можете использовать strstr () с параметром true
источник
www
в начале строки нет. Слишком банальный подход.www
это фактически субдомен. Это просто псевдоним самого доменного имени по историческим причинам.Попробуй это...
источник
источник
$host = explode('.', isset($parsedUrl['path']) ? $parsedUrl['path'] : $parsedUrl['host']);
ты тоже можешь использовать это
источник
Я делаю что-то вроде этого
источник
Мы используем эту функцию для обработки нескольких поддоменов, а несколько tld также обрабатывают ip и localhost
источник
Предположим, текущий url = sub.example.com
источник
Если вы хотите только то, что было до первой менструации:
источник
parse_url()
для извлечения хоста.