2011-03-15 52 views
2
  • www.example.com
  • foo.example.com
  • foo.example.co.uk
  • foo.bar.example.com
  • foo.bar。 example.co.uk

我有這些URL是在這裏,並希望總是以2個變量都:PHP URL分析和disecting

$domainName = "example" 
$domainNameSuffix = ".com" OR ".co.uk" 

如果我有人可以讓我從$ url成爲其中一個網址,一直到$ newUrl接近「example.co.uk」,這將是一件幸事。

請注意,網址將完全是「隨機」,我們最終也可能會得到「foo.bar.example2.com.au」,所以......你知道......呃。 (緣木求魚?)

乾杯,

+0

標題在這裏有點誤導。您正在解析域名,而不是解析它的外觀。基本上,這歸結爲尋找一個TLD數據庫及其與英國和澳大利亞等國家代碼相關的二級數據庫。沒有這些信息,沒有辦法解決這個問題。 – Matthew 2011-03-15 23:51:14

+0

所以這裏是一個重複的:http://stackoverflow.com/questions/4963202/domain-regex-split-你想看看RobertPitt的解決方案作爲替代。如上所述,它可以在最佳賭注基礎上完成。您甚至無法通過TLD探索ala'dig + all co.uk'獲得可靠的結果。 – mario 2011-03-15 23:54:14

回答

2

的「domainNameSuffix」被稱爲top level domain (tld for short),並沒有簡單的方法來解壓。

每個國家都有自己的tld,有些國家選擇進一步細分他們的tld。而且由於子域(my.own.subdomain.example.com)的數量也是可變的,因此不存在簡單的「單一正則表達式」。

如上所述,您需要一個列表。幸運的是你有公開可用的列表:http://publicsuffix.org/

+0

標記爲最佳答案,因爲它最徹底地解決了我的問題。乾杯。 – 2011-03-16 22:48:05

2

你需要保持最準確的結果,我相信擴展名的列表。

$possibleExtensions = array(
    '.com', 
    '.co.uk', 
    '.com.au' 
); 

// parse_url() needs a protocol. 
$str = 'http://' . $str; 

// Use parse_url() to take into account any paths 
// or fragments that may end up being there. 
$host = parse_url($str, PHP_URL_HOST); 

foreach($possibleExtensions as $ext) { 

    if (preg_match('/' . preg_quote($ext, '/') . '\Z/', $host)) { 
     $domainNameSuffix = $ext; 
     // Strip extension  
     $domainName = substr($str, 0, -strlen($ext)); 
     // Strip off http://   
     $domainName = substr($domainName, 7); 
     var_dump($domainName, $domainNameSuffix); 
     break; 

    } 

} 

如果你從未有任何路徑或多餘的東西,當然你也可以跳過parse_url()http://添加和刪除。

It worked for all your tests

+0

這不會爲TLD返回一個密鑰。 – vicTROLLA 2011-03-15 23:41:45

+0

@vicTROLLA'parse_url()'是您可能想要使用的開始,但是,特別是如果它們包含路徑,參數和/或片段。 – alex 2011-03-15 23:46:16

+0

我最終在我的解決方案中使用了很多你的概念(也發佈了) - 謝謝。 – 2011-03-22 01:00:03

3

我們之前有過幾個這樣的問題,但我現在也找不到一個好的問題。關鍵是,這不能可靠地完成。您需要一系列具有自己的.com/.net級別的特殊頂級域名(如.uk和.au)。

但作爲一般的方法和簡單的解決方案,你可以使用:

preg_match('#([\w-]+)\.(\w+(\.(au|uk))?)\.?$#i', $domain, $m); 
list(, $domain, $suffix) = $m; 
+0

葉,它讓我感到吃驚,關於這個問題很多 - 作爲一個相對的PHP(javascript,CSS和HTML是我選擇的武器)noob似乎相當初級。 。編輯:謝謝你的回覆。雖然沒有足夠的積分, '嘲弄我。 – 2011-03-15 23:44:59

+1

它會搞亂http://www.nic.uk/。您可能實際上必須維護英國等有效二級域名的完整列表。 – Matthew 2011-03-15 23:46:02

+0

這很好,很容易,所以+1。我可能錯過了一些東西,但是你需要最後一個可選的'.'('\。?')嗎? – alex 2011-03-15 23:52:25

0

好吧,這是我現在解決它的方法。更多域名的實施也將在未來某個時候完成。不知道我會用什麼技術。

# Setting options, single and dual part domain extentions 
$v2_onePart = array(
       "com" 
       ); 
$v2_twoPart = array(
       "co.uk", 
       "com.au" 
       ); 

$v2_url   = $_SERVER['SERVER_NAME'];  # "example.com"  OR "example.com.au" 
$v2_bits  = explode(".", $v2_url);  # "example", "com" OR "example", "com", "au" 
$v2_bits  = array_reverse($v2_bits);  # "com", "example" OR "au", "com", "example"  (Reversing to eliminate foo.bar.example.com.au problems.) 

switch ($v2_bits) { 
    case in_array($v2_bits[1] . "." . $v2_bits[0], $v2_twoPart): 
     $v2_class = $v2_bits[2] . " " . $v2_bits[1] . "_" . $v2_bits[0]; # "example com_au" 
     break; 
    case in_array($v2_bits[0], $v2_onePart): 
     $v2_class = $v2_bits[1] . " " . $v2_bits[0]; # "example com" 
     break; 
} 
+0

我到底在想什麼。 – 2012-12-17 05:30:56