Czy masz adres URL jako ciąg przechowywany w zmiennej lub skąd pochodzi ten adres URL? Jaki jest kontekst? Proszę rozwinąć.
Felix Kling
Czy nie mógłbyś użyć wyrażenia regularnego, które robi coś podobnego (^|://)(.*)\.i przechwytuje .*? Wolę ssać zarówno php, jak i regex, ale przychodzi mi to na myśl.
corsiKa
Co powinno się dostać en.foo.bar.example.comlub en.example.co.uk?
@Mike Lewis - czy rozwiązuje to problem wielu subdomen, takich jak usa.pl.example.com? Po prostu się zastanawiam (przy okazji moja własna odpowiedź nie).
Jared Farrish
@Jared, właśnie dodałem rozwiązanie do wykrywania wielu subdomen.
Mike Lewis
1
@Mike - Czy to zadziała z tx.usa.en.example.com? (lub science.news.bbc.co.uk )? (btw, to nie działa link, tylko przykład, chociaż news.bbc.co.uk działa)
Jared Farrish
4
Działa to w przypadku wszystkiego, co ma jedno „słowo” TLD, jak np. Net, com, biz itp. Jednak w przypadku np. Co.uk tak nie jest. Jak widać tutaj W rzeczywistości jest to trudniejszy problem do rozwiązania.
Mike Lewis
2
to również zawodzi, jeśli w ogóle nie ma subdomeny.
raveren
32
Możesz to zrobić, najpierw pobierając nazwę domeny (np. Sub.example.com => example.co.uk), a następnie używając strstr, aby uzyskać subdomeny.
Wydaje się, że jest to najlepsze rozwiązanie, ponieważ pozwala również na domeny bez subdomeny, zamiast ponownego wybierania nazwy domeny jako subdomeny będącej częścią przed pierwszą kropką. Bardzo przydatne do sprawdzania istnienia subdomeny.
Karl MW,
Musiałem zdobyć domenę „podstawową” (bez subdomeny) i tworzyłem własne rozwiązanie, eksplodując hosta i pobierając forpętlę ostatnich elementów tablicy , ale musiałem sprawdzić ich długość (aby wykryć, czy były częścią domeny jak „co.uk”). W rzeczywistości twoje rozwiązanie jest znacznie prostsze niż to, co robiłem. Regex ratuje życie, dzięki!
Yoone
1
Świetnie… to działa tak dobrze dla wszystkich typów domen i subdomen… fajnie.
jon
2
podczas gdy takie rozwiązanie jest bardzo schludny i może pracować w prawie wszystkich przypadkach, należy pamiętać, że nazwy domen może mieć więcej niż 6 znaków, jak pvt.k12.ma.us, health.vnlub nawet k12.ak.us. Ponadto nazwy domen mogą używać zestawu znaków chińskich lub rosyjskich, więc część wyrażenia regularnego [a-z\.]{2,6}nie będzie do nich pasować. Sprawdź tutaj, aby zobaczyć przykładową nazwę domeny: publicsuffix.org/list
Ponieważ jedynym wiarygodnym źródłem sufiksów domen są rejestratorzy domen, nie możesz znaleźć subdomeny bez ich wiedzy. Lista wszystkich sufiksów domen znajduje się na https://publicsuffix.org . Ta strona zawiera również linki do biblioteki PHP: https://github.com/jeremykendall/php-domain-parser .
Poniżej przykład. Dodałem również przykład dla en.test.co.uk, który jest domeną z wieloma sufiksami (co.uk).
PS - Nie mam pojęcia, co jest napisane w rosyjskim tekście. Właśnie wziąłem kilka przypadkowych słów z ru.wikipedia.org ;)
Kamafeather
Czy to nie ukraińskie? .uato kod kraju dla Ukrainy.
nalply
Nie. Po prostu pomieszane informacje. Ale nie jestem pewien, nie jestem wystarczająco dobry, aby je rozróżnić;)
Kamafeather
3
Jeśli chodzi o język rosyjski, tłumacz Google z rosyjskiego na angielski powraca jako „opublikowane wartości” (na wypadek, gdyby ktoś był ciekawy, tak jak ja)
Jeremy Harris
@Kamafeather to wygląda na kuloodporne. Jest jakiś sposób, żeby po prostu dostać tę $match[1]rolę? $match[0]wydaje się niepotrzebne.
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,'.'));
Istnieją lepsze sposoby automatycznego wykrywania bieżącego hosta (np. $_SERVER['HTTP_HOST']), A następnie poleganie na fałszywym nagłówku strony odsyłającej, zakładając, że na tym właśnie polega ogólna idea odpowiedzi.
Matthew
Racja, użyłem starego fragmentu kodu. Przykład jest jednak nadal aktualny. To nie jest źródło pytania.
Jared Farrish
Podsumowując powyższe komentarze, poleganie na $ _SERVER ['HTTP_HOST'] może nie być skuteczne, ponieważ istnieje prawdopodobieństwo, że nie zostanie ustawione.
gmslzr
2
PHP 7.0: Użycie funkcji eksploduj i utwórz listę wszystkich wyników.
Tak naprawdę nie ma rozwiązania w 100% dynamicznego - właśnie próbowałem to rozgryźć, a ze względu na różne rozszerzenia domeny (DTL) zadanie to byłoby naprawdę trudne bez faktycznego analizowania wszystkich tych rozszerzeń i sprawdzania ich za każdym razem:
.com vs .co.uk vs org.uk
Najbardziej niezawodną opcją jest zdefiniowanie stałej (lub wpis w bazie danych itp.), Która przechowuje rzeczywistą nazwę domeny i usunięcie jej z $_SERVER['SERVER_NAME']używaniasubstr()
Teraz, jeśli używasz tej funkcji w ramach http://test.mymaindomain.co.uk, da ci ona testlub jeśli masz wiele poziomów subdomeny http://another.test.mymaindomain.co.uk, otrzymasz another.test- chyba że oczywiście zaktualizujesz DOMAIN.
Używanie wyrażeń regularnych, funkcji łańcuchowych, parse_url () lub ich kombinacji nie jest prawdziwym rozwiązaniem. Po prostu przetestuj dowolne z proponowanych rozwiązań z domeną test.en.example.co.uk, nie będzie żadnego poprawnego wyniku.
// 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
Odcinam podciąg na 12 zamiast 11, ponieważ podciągi zaczynają się od 1 dla drugiego parametru. Więc teraz, jeśli wpiszesz test.example.com, wartość $subdomainbędzie test.
Jest to lepsze niż używanie, explodeponieważ jeśli subdomena ma w sobie znak ., nie spowoduje to odcięcia.
To zadziała tylko wtedy, gdy nie ma wwwna początku łańcucha. Trochę zbyt banalne podejście.
FooBar
To upraszcza rzeczy innym programistom w zespole, wolałbym używać tego niż niektórych zaawansowanych reg exp. Jeśli chcesz przyciąć www, użyj trim ($ s, 'www'); lub po prostu dostosuj to do swojej logiki biznesowej ...
tasmaniski
1
Ze względu na kompletność wwwjest w rzeczywistości subdomeną. Jest po prostu często aliasowany do samej nazwy domeny ze względów historycznych.
Używamy tej funkcji do obsługi wielu subdomen, a wiele tld obsługuje również adresy IP i 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;}
Co jeśli na początku znajduje się program obsługi protokołu, taki jak http: //, https: //, ftp: //, itd ...? ;)
Jared Farrish
@Jared, nie ma protokołu w ciągu, który chce przeanalizować ... Ale gdyby istniał, użyłbym parse_url()do wyodrębnienia hosta.
Matthew
Dlatego przedstawiliśmy dwa podejścia, które będą odpowiednie w różnych kontekstach.
Jared Farrish
Przede wszystkim cieszę się, że ktoś nie opublikował odpowiedzi wyrażenia regularnego (jeszcze). Nie wspominając już o ostatniej linijce mojej odpowiedzi, która spełnia to samo, co twoja.
(^|://)(.*)\.
i przechwytuje.*
? Wolę ssać zarówno php, jak i regex, ale przychodzi mi to na myśl.en.foo.bar.example.com
luben.example.co.uk
?Odpowiedzi:
Oto jedno liniowe rozwiązanie:
Lub na przykładzie:
EDYCJA: Naprawiono „tylko zmienne powinny być przekazywane przez odniesienie” poprzez dodanie podwójnych nawiasów.
EDYCJA 2 : Począwszy od PHP 5.4 możesz po prostu:
źródło
explode(...)[0]
dzisiejszych czasach nie jesteś w stanie po prostu zrobić zamiast używać zmiany? Nie PHPing od kilku lat ...Strict Standards: Only variables should be passed by reference.
www.en.example.com
i wróciwww
jako subdomena.Używa funkcji parse_url .
Dla wielu subdomen
źródło
Możesz to zrobić, najpierw pobierając nazwę domeny (np. Sub.example.com => example.co.uk), a następnie używając strstr, aby uzyskać subdomeny.
Wyjścia:
źródło
for
pętlę ostatnich elementów tablicy , ale musiałem sprawdzić ich długość (aby wykryć, czy były częścią domeny jak „co.uk”). W rzeczywistości twoje rozwiązanie jest znacznie prostsze niż to, co robiłem. Regex ratuje życie, dzięki!pvt.k12.ma.us
,health.vn
lub nawetk12.ak.us
. Ponadto nazwy domen mogą używać zestawu znaków chińskich lub rosyjskich, więc część wyrażenia regularnego[a-z\.]{2,6}
nie będzie do nich pasować. Sprawdź tutaj, aby zobaczyć przykładową nazwę domeny: publicsuffix.org/listhttp://php.net/parse_url
źródło
Ponieważ jedynym wiarygodnym źródłem sufiksów domen są rejestratorzy domen, nie możesz znaleźć subdomeny bez ich wiedzy. Lista wszystkich sufiksów domen znajduje się na https://publicsuffix.org . Ta strona zawiera również linki do biblioteki PHP: https://github.com/jeremykendall/php-domain-parser .
Poniżej przykład. Dodałem również przykład dla en.test.co.uk, który jest domeną z wieloma sufiksami (co.uk).
źródło
Najprostsze i najszybsze rozwiązanie.
źródło
Po prostu...
Po prostu przeczytaj $ match [1]
Przykład roboczy
Działa doskonale z tą listą adresów URL
źródło
.ua
to kod kraju dla Ukrainy.$match[1]
rolę?$match[0]
wydaje się niepotrzebne.źródło
$_SERVER['HTTP_HOST']
), A następnie poleganie na fałszywym nagłówku strony odsyłającej, zakładając, że na tym właśnie polega ogólna idea odpowiedzi.PHP 7.0: Użycie funkcji eksploduj i utwórz listę wszystkich wyników.
Przykład: sub.domain.com
Wynik: sub
Wynik: domena
źródło
.co.uk
- Twój fragment nie będzie działał z tymi TLDNajlepsze i krótkie rozwiązanie znalazłem
źródło
Dla tych, którzy otrzymają komunikat „Błąd: ścisłe standardy: tylko zmienne powinny być przekazywane przez odniesienie”. Użyj w ten sposób:
$env = (explode(".",$_SERVER['HTTP_HOST'])); $env = array_shift($env);
źródło
Jak widać w poprzednim pytaniu: Jak zdobyć pierwszą subdomenę za pomocą PHP?
źródło
Tak naprawdę nie ma rozwiązania w 100% dynamicznego - właśnie próbowałem to rozgryźć, a ze względu na różne rozszerzenia domeny (DTL) zadanie to byłoby naprawdę trudne bez faktycznego analizowania wszystkich tych rozszerzeń i sprawdzania ich za każdym razem:
.com vs .co.uk vs org.uk
Najbardziej niezawodną opcją jest zdefiniowanie stałej (lub wpis w bazie danych itp.), Która przechowuje rzeczywistą nazwę domeny i usunięcie jej z
$_SERVER['SERVER_NAME']
używaniasubstr()
Teraz, jeśli używasz tej funkcji w ramach
http://test.mymaindomain.co.uk
, da ci onatest
lub jeśli masz wiele poziomów subdomenyhttp://another.test.mymaindomain.co.uk
, otrzymaszanother.test
- chyba że oczywiście zaktualizujeszDOMAIN
.Mam nadzieję, że to pomoże.
źródło
Po prostu
reset(explode(".", $_SERVER['HTTP_HOST']))
źródło
Używanie wyrażeń regularnych, funkcji łańcuchowych, parse_url () lub ich kombinacji nie jest prawdziwym rozwiązaniem. Po prostu przetestuj dowolne z proponowanych rozwiązań z domeną
test.en.example.co.uk
, nie będzie żadnego poprawnego wyniku.Prawidłowym rozwiązaniem jest użycie pakietu, który analizuje domenę z listą sufiksów publicznych . Polecam TLDExtract , oto przykładowy kod:
źródło
to jest moje rozwiązanie, działa z najpopularniejszymi domenami, możesz dopasować szereg rozszerzeń według potrzeb:
źródło
źródło
Wiem, że jestem naprawdę spóźniony na mecz, ale proszę bardzo.
To, co zrobiłem, to wziąłem zmienną serwera HTTP_HOST (
$_SERVER['HTTP_HOST']
) i liczbę liter w domenie (więcexample.com
będzie to 11).Następnie użyłem
substr
funkcji, aby uzyskać subdomenę. ZrobiłemOdcinam podciąg na 12 zamiast 11, ponieważ podciągi zaczynają się od 1 dla drugiego parametru. Więc teraz, jeśli wpiszesz test.example.com, wartość
$subdomain
będzietest
.Jest to lepsze niż używanie,
explode
ponieważ jeśli subdomena ma w sobie znak.
, nie spowoduje to odcięcia.źródło
jeśli używasz drupal 7
to ci pomoże:
źródło
źródło
Od PHP 5.3 możesz używać strstr () z prawdziwym parametrem
źródło
www
na początku łańcucha. Trochę zbyt banalne podejście.www
jest w rzeczywistości subdomeną. Jest po prostu często aliasowany do samej nazwy domeny ze względów historycznych.Spróbuj tego...
źródło
źródło
$host = explode('.', isset($parsedUrl['path']) ? $parsedUrl['path'] : $parsedUrl['host']);
możesz też tego użyć
źródło
Robię coś takiego
źródło
Używamy tej funkcji do obsługi wielu subdomen, a wiele tld obsługuje również adresy IP i localhost
źródło
Załóżmy, że aktualny adres URL = sub.example.com
źródło
Jeśli chcesz tylko tego, co nastąpi przed pierwszym okresem:
źródło
parse_url()
do wyodrębnienia hosta.