Php alan adı (subdomain) alın

4 Cevap php

Ben aşağıdaki biçimlerden herhangi biri olabilir bir URL var:

http://example.com
https://example.com
http://example.com/foo
http://example.com/foo/bar
www.example.com
example.com
foo.example.com
www.foo.example.com
foo.bar.example.com
http://foo.bar.example.com/foo/bar
example.net/foo/bar

Esasen, ben normal bir URL maç gerekiyor. Nasıl tek bir regex aracılığıyla tüm bu gelen example.com (veya TLD olması ne olursa olsun. Net,. Herhangi TLD ile çalışmak için bu gerekir.) Ayıklamak?

4 Cevap

Peki parse_url host almak için kullanabilirsiniz:

$info = parse_url($url);
$host = $info['host'];

Sonra, sadece TLD ve Sunucuyu almak için biraz fantezi şeyler yapabilirsiniz

$host_names = explode(".", $host);
$bottom_host_name = $host_names[count($host_names)-2] . "." . $host_names[count($host_names)-1];

Çok zarif değil, ama çalışması gerekir.


Eğer bir açıklama isterseniz, buraya gidiyor:

İlk parse_url 's yeteneklerini için ... iyi .... ayrıştırma URL kullanılarak, (http://, vb) düzeni arasındaki her şeyi kapmak. :)

Sonra ana bilgisayar adını alır ve dönemleri düşüş nereye dayalı bir diziye ayırmak, yani test.world.hello.myname olacak:

array("test", "world", "hello", "myname");

Bundan sonra, biz dizideki elemanların sayısını almak (4).

Ardından, (sizin örnekte, hostname, veya example) son dizesi ikinci almak için ondan 2 çıkarma

Sonra, biz de TLD olarak bilinen, (Dizi anahtarları 0'dan başlar çünkü) son dize almak için ondan 1 çıkarma

Sonra bir süre ile bu iki parçaları birleştirmek, ve sizin taban ana bilgisayar adı var.

https://gist.github.com/pocesar/5366899 Benim çözüm

ve testler burada http://codepad.viper-7.com/QfueI0

Herhangi bir TLD ve iğrenç alt alan desenleri (3 adede kadar alt alanları) ile çalışır.

Birçok alan adları ile birlikte bir test var.

Çünkü StackOverflow kod için garip girinti burada işlevi yapıştırın olmaz (github gibi kod blokları çit olabilir)

Bu http://www.db.de/ veya http://bbc.co.uk/ gibi birçok durumda onların var olduğu ile karşılaştırmak için bir TLD listesini kullanarak olmadan mümkün değildir

Ancak bu bile size çünkü SLD en http://big.uk.com/ gibi veya http://www.uk.com/ her durumda başarı olmaz

Eğer tam bir listesini gerekiyorsa kamu sonek listesini kullanabilirsiniz:

http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

Benim işlevini kullanmak için çekinmeyin. Bu regex kullanmak olmaz ve hızlı:

http://www.programmierer-forum.de/domainnamen-ermitteln-t244185.htm#3471878

Ben bu sorunu işlemek için güzel bir yol olduğunu düşünüyorum:

$domain = $_SERVER['HTTP_HOST'];
$domain = explode('.', $domain);
$domain = array_reverse($domain);
$domain = "$domain[1].$domain[0]";