2010-02-24 65 views
3

如何在PHP中解析URL中的域名?看來我需要一個國家/地區域數據庫。解析URL中的域名在PHP中

實例:

http://mail.google.com/hfjdhfjd/jhfjd.html - > google.com
http://www.google.bg/jhdjhf/djfhj.html - > google.bg
http://www.google.co.uk/djhdjhf.php - >使用google.co.uk
http://www.tsk.tr/jhjgc.aspx - > tsk.tr
http://subsub.sub.nic.tr/ - > NIC .tr
http://subsub.sub.google.com.tr - > google.com.tr
http://subsub.sub.itoy.info.tr - > itoy.info.tr

可以使用whois請求完成嗎?

編輯:有幾個域名與.trwww.nic.trwww.tsk.tr)其他都是如你所知:www.something.com.trwww.something.org.tr

還沒有www.something.com.bgwww.something.org.bg。他們www.something.bg像德國.de

但也有www.something.a.bgwww.something.b.bg從而a.bgb.bgc.bg等。 (a.bg就像co.uk

在網絡上有必須列出這些頂級域名。

檢查如何在Internet Explorer中對url http://www.agrotehnika97.a.bg/着色。 檢查也

www.google.co.uk<br> 
www.google.com.tr<br> 
www.nic.tr<br> 
www.tsk.tr 
+1

注,即* co.uk *,* com.tr *和* info.tr *本身是完全有效的域/主機名,而所有這些都是*不*頂級域名。正如'google.co.uk'中的'google'只是* co.uk'的一個子域。鑑於你可以自由組合幾乎所有的東西,你可能無法爲此做出完整的表格。 – poke 2010-02-24 17:19:36

+0

@poke,我在網站上看到了這個列表。 Firefox正在使用該網站的列表。但我不記得它。 – ilhan 2010-02-24 17:27:41

+1

http://publicsuffix.org – Franz 2010-02-24 17:44:06

回答

2

域被存儲在$_SERVER['HTTP_HOST']

編輯:我相信這會返回整個域。剛剛獲得頂級域名,你可以這樣做:

// Add all your wanted subdomains that act as top-level domains, here (e.g. 'co.cc' or 'co.uk') 
// As array key, use the last part ('cc' and 'uk' in the above examples) and the first part as sub-array elements for that key 
$allowed_subdomains = array(
    'cc' => array(
     'co' 
    ), 
    'uk' => array(
     'co' 
    ) 
); 

$domain = $_SERVER['HTTP_HOST']; 
$parts = explode('.', $domain); 
$top_level = array_pop($parts); 

// Take care of allowed subdomains 
if (isset($allowed_subdomains[$top_level])) 
{ 
    if (in_array(end($parts), $allowed_subdomains[$top_level])) 
     $top_level = array_pop($parts).'.'.$top_level; 
} 

$top_level = array_pop($parts).'.'.$top_level; 
+0

這不完全是ilhan之後的事情。 – 2010-02-24 17:00:14

+0

爲什麼不呢?編輯修復了它。 – Franz 2010-02-24 17:01:42

+0

即使在編輯之後它仍然不起作用;-)。它不涉及google.co.uk案件,因爲這會返回'co.uk'。 – 2010-02-24 17:06:30

1

您可以使用parse_url()將其分割,並得到你想要的。 下面是一個例子...

 
    $url = 'http://www.google.com/search?hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd'; 
    print_r(parse_url($url)); 

迴音必...

 
Array 
(
    [scheme] => http 
    [host] => www.google.com 
    [path] => /search 
    [query] => hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd 
)
+1

我在開始時做了同樣的錯誤。不過,他只想要google.com。 – Franz 2010-02-24 17:02:09

+1

我明白了。夠公平 - 他可以'preg_match()'來獲得其餘的。假設'$ url_split'是解析的URL - 這可以通過... preg_match('/ www \。?([\ w \ - \。] +)([az \。] +)/ i' ,$ url_split ['host'],$ matches)' - 然後他可以使用'$ matches [1]。$ matches [2]'來獲取沒有第一個域的主機。問題在於,你永遠無法預測子域會走多遠 - 它可能是「sub1.sub2.domain.co.uk」 - 這會獲取「sub2.domain.co.uk」,而不是域。 co.uk' – casraf 2010-02-24 17:11:54

1

我想你需要一個域名後使用的所有後綴的列表。 http://publicsuffix.org/list/提供當前使用的所有後綴的最新(或聲明)。 名單實際上是here 現在的想法是讓你這個列表解析成一個結構,不同層次由點分裂,年底的水平開始回升:

所以例如用於域: COM .la com.tr com。LC

你最終用:

[la]=>[com] 
[lc]=>[com] 

等等

然後你會得到從BASE_URL主機(通過使用parse_url),而且你用點爆發, 。你開始匹配你的結構的價值觀,從最後一個開始:

所以對於google.com.tr你會開始匹配tr,然後com,那麼你一旦得到匹配就不會找到匹配谷歌,這是你想要的...

1

正則表達式和parse_url()不是你的解決方案。

您需要使用Public Suffix List的包,只有這樣您才能正確提取具有兩級,三級TLD(co.uk,a.bg,b.bg等)的域。我建議使用TLD Extract。代碼

這裏例如:

$extract = new LayerShifter\TLDExtract\Extract(); 

$result = $extract->parse('http://subsub.sub.google.com.tr'); 
$result->getRegistrableDomain(); // will return (string) 'google.com.tr'