Apakah Anda memiliki URL sebagai string yang disimpan dalam variabel atau dari mana asalnya URL ini? Apa konteksnya? Tolong jelaskan.
Felix Kling
Tidak bisakah Anda menggunakan regex yang melakukan sesuatu seperti (^|://)(.*)\.dan menangkapnya .*? Saya agak payah di php dan regex, tapi ini yang terlintas dalam pikiran.
corsiKa
Apa yang harus dimasukkan en.foo.bar.example.comatau en.example.co.uk?
@Mike Lewis - Apakah ini menyelesaikan masalah beberapa subdomain, seperti usa.en.example.com? Hanya bertanya-tanya (jawaban saya sendiri tidak, btw).
Jared Farrish
@Jared, baru saja menambahkan solusi untuk mendeteksi beberapa subdomain.
Mike Lewis
1
@Mike - Apakah itu akan berfungsi dengan tx.usa.en.example.com? (atau science.news.bbc.co.uk )? (btw, itu bukan tautan yang berfungsi, hanya sebuah contoh, meskipun news.bbc.co.uk berfungsi)
Jared Farrish
4
Itu berfungsi untuk semua yang memiliki satu 'kata' TLD seperti net, com, biz dll. Namun ketika berurusan dengan co.uk, misalnya, tidak. Seperti yang terlihat di sini Ini sebenarnya masalah yang lebih sulit untuk dipecahkan.
Mike Lewis
2
ini juga gagal jika tidak ada subdomain sama sekali.
raveren
32
Anda dapat melakukan ini dengan terlebih dahulu mendapatkan nama domain (mis. Sub.example.com => example.co.uk) dan kemudian menggunakan strstr untuk mendapatkan subdomain.
Ini tampaknya merupakan solusi terbaik karena juga memungkinkan domain tanpa subdomain, daripada melakukan tuning ulang nama domain karena subdomain menjadi bagian sebelum titik pertama. Sangat berguna untuk memeriksa keberadaan subdomain.
Karl MW
Saya perlu mendapatkan domain "base" (tanpa subdomain), dan saya membuat solusi sendiri dengan meledakkan host dan mendapatkan elemen terakhir dari array dengan forloop, tetapi saya harus memeriksa panjangnya (untuk mendeteksi apakah mereka adalah bagian dari domain seperti "co.uk"). Sebenarnya, solusi Anda jauh lebih sederhana daripada yang saya lakukan sebelumnya. Regex menyelamatkan nyawa, terima kasih!
Yoone
1
Luar biasa .. ini berfungsi sangat baik untuk semua jenis domain dan subdomain .. bagus.
jon
2
Meskipun solusi ini sangat rapi dan dapat berfungsi di hampir semua kasus, ketahuilah bahwa nama domain mungkin memiliki lebih dari 6 karakter, suka pvt.k12.ma.us, health.vnatau bahkan k12.ak.us. Selain itu, nama domain mungkin menggunakan himpunan karakter bahasa Cina atau Rusia sehingga bagian regex [a-z\.]{2,6}tidak akan cocok dengan mereka. Lihat di sini untuk mendapatkan contoh nama domain: publicsuffix.org/list
Karena satu-satunya sumber yang dapat diandalkan untuk sufiks domain adalah pendaftar domain, Anda tidak dapat menemukan subdomain tanpa sepengetahuan mereka. Ada daftar dengan semua sufiks domain di https://publicsuffix.org . Situs ini juga tertaut ke pustaka PHP: https://github.com/jeremykendall/php-domain-parser .
Temukan contoh di bawah ini. Saya juga menambahkan contoh untuk en.test.co.uk yang merupakan domain dengan multi sufiks (co.uk).
PS - Saya tidak tahu apa yang tertulis dalam teks Rusia. Hanya mengambil beberapa kata santai dari ru.wikipedia.org ;)
Kamafeather
Bukankah itu bahasa Ukraina? .uaadalah kode negara untuk Ukraina.
nalply
Nggak. Informasi hanya bercampur. Tapi saya tidak yakin, saya tidak cukup baik untuk membedakannya;)
Kamafeather
3
Sehubungan dengan bahasa Rusia, google translate dari bahasa Rusia ke bahasa Inggris muncul kembali sebagai "nilai yang dipublikasikan" (jika ada yang penasaran seperti saya)
Jeremy Harris
@Kather ini terlihat seperti peluru. Adakah cara untuk mendapatkan $match[1]bagian itu? $match[0]sepertinya tidak perlu.
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,'.'));
Ada cara yang lebih baik untuk secara otomatis mendeteksi host saat ini (seperti $_SERVER['HTTP_HOST']) kemudian mengandalkan tajuk perujuk yang dapat dipalsukan, dengan asumsi itulah gagasan umum di balik jawabannya.
Matius
Benar, saya menggunakan kode lama. Namun, contohnya masih berlaku. Itu bukanlah akar dari pertanyaannya.
Jared Farrish
Hanya untuk menambahkan komentar di atas, mengandalkan $ _SERVER ['HTTP_HOST'] mungkin tidak efisien, karena ada kemungkinan tidak disetel.
gmslzr
2
PHP 7.0: Menggunakan fungsi meledak dan membuat daftar semua hasil.
Sebenarnya tidak ada solusi dinamis 100% - Saya baru saja mencoba mengetahuinya juga dan karena ekstensi domain (DTL) yang berbeda, tugas ini akan sangat sulit tanpa benar-benar mem-parsing semua ekstensi ini dan memeriksanya setiap kali:
.com vs .co.uk vs org.uk
Opsi yang paling dapat diandalkan adalah dengan menentukan konstanta (atau entri database, dll.) Yang menyimpan nama domain sebenarnya dan menghapusnya dari $_SERVER['SERVER_NAME']penggunaansubstr()
Sekarang jika Anda menggunakan fungsi ini di bawahnya, http://test.mymaindomain.co.ukitu akan memberi Anda testatau jika Anda memiliki beberapa tingkat sub-domain http://another.test.mymaindomain.co.ukAnda akan mendapatkan another.test- kecuali tentu saja Anda memperbarui DOMAIN.
Menggunakan regex, fungsi string, parse_url () atau kombinasinya, ini bukan solusi nyata. Cukup uji salah satu solusi yang diusulkan dengan domain test.en.example.co.uk, tidak akan ada hasil yang benar.
Solusi yang tepat adalah menggunakan paket yang mem-parsing domain dengan Daftar Sufiks Publik . Saya merekomendasikan TLDExtract , berikut ini contoh kode:
$extract =newLayerShifter\TLDExtract\Extract();
$result = $extract->parse('test.en.example.co.uk');
$result->getSubdomain();// will return (string) 'test.en'
$result->getSubdomains();// will return (array) ['test', 'en']
$result->getHostname();// will return (string) 'example'
$result->getSuffix();// will return (string) '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
Saya tahu saya sangat terlambat ke permainan, tapi ini dia.
Apa yang saya lakukan adalah mengambil variabel server HTTP_HOST ( $_SERVER['HTTP_HOST']) dan jumlah huruf dalam domain (jadi untuk example.comitu akan menjadi 11).
Kemudian saya menggunakan substrfungsi tersebut untuk mendapatkan subdomain. aku melakukannya
Saya memotong substring pada 12, bukan 11 karena substring dimulai pada 1 untuk parameter kedua. Jadi sekarang jika Anda memasukkan test.example.com, nilainya $subdomainadalah test.
Ini lebih baik daripada menggunakan explodekarena jika subdomain memiliki .di dalamnya, ini tidak akan memotongnya.
Ini hanya akan bekerja jika tidak ada wwwdi awal string. Pendekatan yang agak terlalu sepele.
FooBar
Ini menyederhanakan banyak hal untuk pengembang lain dalam tim, saya lebih suka menggunakan ini daripada beberapa exp reg lanjutan. Jika Anda ingin memangkas www, gunakan trim ($ s, 'www'); atau sesuaikan saja dengan logika bisnis Anda ...
tasmaniski
1
Demi kelengkapan, wwwadalah benar-benar subdomain. Ini biasanya dialiaskan ke nama domain itu sendiri karena alasan historis.
Kami menggunakan fungsi ini untuk menangani banyak subdomain dan banyak tld juga menangani ip dan 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;}
Bagaimana jika ada penangan protokol di awal, seperti http: //, https: //, ftp: //, dll ...? ;)
Jared Farrish
@ Jared, tidak ada protokol dalam string yang ingin dia parse ... Tetapi jika ada, saya akan menggunakan parse_url()untuk mengekstrak host.
Matius
Jadi kami telah menyediakan dua pendekatan yang akan sesuai dalam konteks yang berbeda.
Jared Farrish
Terutama, saya senang seseorang belum memposting jawaban regex (belum). Belum lagi baris terakhir jawaban saya juga mencapai hal yang sama dengan milik Anda.
(^|://)(.*)\.
dan menangkapnya.*
? Saya agak payah di php dan regex, tapi ini yang terlintas dalam pikiran.en.foo.bar.example.com
atauen.example.co.uk
?Jawaban:
Berikut solusi satu baris:
Atau menggunakan contoh Anda:
EDIT: Tetap "hanya variabel yang harus diteruskan dengan referensi" dengan menambahkan tanda kurung ganda.
EDIT 2 : Mulai dari PHP 5.4 Anda cukup melakukan:
sumber
explode(...)[0]
daripada menggunakan shift hari ini? Belum PHPing selama beberapa tahun ..Strict Standards: Only variables should be passed by reference.
www.en.example.com
dan dengan demikian akan kembaliwww
sebagai subdomain.Menggunakan fungsi parse_url .
Untuk beberapa subdomain
sumber
Anda dapat melakukan ini dengan terlebih dahulu mendapatkan nama domain (mis. Sub.example.com => example.co.uk) dan kemudian menggunakan strstr untuk mendapatkan subdomain.
Keluaran:
sumber
for
loop, tetapi saya harus memeriksa panjangnya (untuk mendeteksi apakah mereka adalah bagian dari domain seperti "co.uk"). Sebenarnya, solusi Anda jauh lebih sederhana daripada yang saya lakukan sebelumnya. Regex menyelamatkan nyawa, terima kasih!pvt.k12.ma.us
,health.vn
atau bahkank12.ak.us
. Selain itu, nama domain mungkin menggunakan himpunan karakter bahasa Cina atau Rusia sehingga bagian regex[a-z\.]{2,6}
tidak akan cocok dengan mereka. Lihat di sini untuk mendapatkan contoh nama domain: publicsuffix.org/listhttp://php.net/parse_url
sumber
Karena satu-satunya sumber yang dapat diandalkan untuk sufiks domain adalah pendaftar domain, Anda tidak dapat menemukan subdomain tanpa sepengetahuan mereka. Ada daftar dengan semua sufiks domain di https://publicsuffix.org . Situs ini juga tertaut ke pustaka PHP: https://github.com/jeremykendall/php-domain-parser .
Temukan contoh di bawah ini. Saya juga menambahkan contoh untuk en.test.co.uk yang merupakan domain dengan multi sufiks (co.uk).
sumber
Solusi paling sederhana dan tercepat.
sumber
Secara sederhana...
Baru saja membaca $ match [1]
Contoh kerja
Ini berfungsi sempurna dengan daftar url ini
sumber
.ua
adalah kode negara untuk Ukraina.$match[1]
bagian itu?$match[0]
sepertinya tidak perlu.sumber
$_SERVER['HTTP_HOST']
) kemudian mengandalkan tajuk perujuk yang dapat dipalsukan, dengan asumsi itulah gagasan umum di balik jawabannya.PHP 7.0: Menggunakan fungsi meledak dan membuat daftar semua hasil.
Contoh: sub.domain.com
Hasil: sub
Hasil: domain
sumber
.co.uk
- cuplikan Anda tidak akan berfungsi dengan TLD iniApa yang saya temukan adalah solusi terbaik dan singkat
sumber
Bagi mereka yang mendapatkan 'Kesalahan: Standar Ketat: Hanya variabel yang harus diteruskan dengan referensi.' Gunakan seperti ini:
$env = (explode(".",$_SERVER['HTTP_HOST'])); $env = array_shift($env);
sumber
Seperti yang terlihat pada pertanyaan sebelumnya: Bagaimana cara mendapatkan subdomain pertama dengan PHP?
sumber
Sebenarnya tidak ada solusi dinamis 100% - Saya baru saja mencoba mengetahuinya juga dan karena ekstensi domain (DTL) yang berbeda, tugas ini akan sangat sulit tanpa benar-benar mem-parsing semua ekstensi ini dan memeriksanya setiap kali:
.com vs .co.uk vs org.uk
Opsi yang paling dapat diandalkan adalah dengan menentukan konstanta (atau entri database, dll.) Yang menyimpan nama domain sebenarnya dan menghapusnya dari
$_SERVER['SERVER_NAME']
penggunaansubstr()
Sekarang jika Anda menggunakan fungsi ini di bawahnya,
http://test.mymaindomain.co.uk
itu akan memberi Andatest
atau jika Anda memiliki beberapa tingkat sub-domainhttp://another.test.mymaindomain.co.uk
Anda akan mendapatkananother.test
- kecuali tentu saja Anda memperbaruiDOMAIN
.Saya harap ini membantu.
sumber
Secara sederhana
reset(explode(".", $_SERVER['HTTP_HOST']))
sumber
Menggunakan regex, fungsi string, parse_url () atau kombinasinya, ini bukan solusi nyata. Cukup uji salah satu solusi yang diusulkan dengan domain
test.en.example.co.uk
, tidak akan ada hasil yang benar.Solusi yang tepat adalah menggunakan paket yang mem-parsing domain dengan Daftar Sufiks Publik . Saya merekomendasikan TLDExtract , berikut ini contoh kode:
sumber
ini adalah solusi saya, ini berfungsi dengan domain yang paling umum, Anda dapat menyesuaikan berbagai ekstensi yang Anda butuhkan:
sumber
sumber
Saya tahu saya sangat terlambat ke permainan, tapi ini dia.
Apa yang saya lakukan adalah mengambil variabel server HTTP_HOST (
$_SERVER['HTTP_HOST']
) dan jumlah huruf dalam domain (jadi untukexample.com
itu akan menjadi 11).Kemudian saya menggunakan
substr
fungsi tersebut untuk mendapatkan subdomain. aku melakukannyaSaya memotong substring pada 12, bukan 11 karena substring dimulai pada 1 untuk parameter kedua. Jadi sekarang jika Anda memasukkan test.example.com, nilainya
$subdomain
adalahtest
.Ini lebih baik daripada menggunakan
explode
karena jika subdomain memiliki.
di dalamnya, ini tidak akan memotongnya.sumber
jika Anda menggunakan drupal 7
ini akan membantu Anda:
sumber
sumber
Dari PHP 5.3 Anda dapat menggunakan strstr () dengan parameter true
sumber
www
di awal string. Pendekatan yang agak terlalu sepele.www
adalah benar-benar subdomain. Ini biasanya dialiaskan ke nama domain itu sendiri karena alasan historis.Coba ini...
sumber
sumber
$host = explode('.', isset($parsedUrl['path']) ? $parsedUrl['path'] : $parsedUrl['host']);
kamu bisa menggunakan ini juga
sumber
Saya melakukan sesuatu seperti ini
sumber
Kami menggunakan fungsi ini untuk menangani banyak subdomain dan banyak tld juga menangani ip dan localhost
sumber
Misalkan url saat ini = sub.example.com
sumber
Jika Anda hanya menginginkan apa yang datang sebelum periode pertama:
sumber
parse_url()
untuk mengekstrak host.