2011-03-24 60 views
1

我正在嘗試讓用戶提交鏈接框。我一整天都在嘗試,似乎無法讓它工作。清理php中的url

的目標是讓所有的這些成example.com ...

輸入是$url =

他們的4種類型的URL(即頂級域之前刪除所有的東西。):

www.example.com... 
example.com... 
http://www.example.com... 
http://example.com... 

一切我就1或2種類型的作品,但不是所有的4

怎麼可以這樣做呢?

+2

mail.google.com或en.wikipedia.org怎麼樣?它會是第四和第五類型嗎? – 2011-03-24 20:02:31

+0

@Col。 Shrapnel,我已經發布了關於處理這個問題的更好方法的回覆。 – RobertPitt 2011-03-24 20:28:41

回答

1

您可以使用parse_url。例如:

function parse($url) { 
    $parts = parse_url($url); 
    if ($parts === false) { 
     return false; 
    } 
    return isset($parts['scheme']) 
      ? $parts['host'] 
      : substr($parts['path'], 0, strcspn($parts['path'], '/')); 
} 

這將離開「www」。如果它已經存在,那麼它是微不足道的。 str_replace。如果你給它的網址嚴重畸形,它將返回false

更新(新的改進方案):

我意識到,上面會不正確,如果你試圖欺騙它夠硬的工作。因此,而不是鞭打自己努力,如果沒有一個方案來補償,我意識到這將是更好:

function parse($url) { 
    $parts = parse_url($url); 
    if ($parts === false) { 
     return false; 
    } 
    if (!isset($parts['scheme'])) { 
     $parts = parse_url('http://'.$url); 
    } 
    if ($parts === false) { 
     return false; 
    } 

    return $parts['host']; 
} 
0

有你可以採取得到一個乾淨的URL幾步之遙。

首先,你需要確保有一個協議,使parse_url正常工作,所以你可以這樣做:通過parse_url()

$segments = parse_url($url); 

//Make sure it has a protocol 
if(substr($url,0,7) != 'http://' || substr($url,0,8) != 'https://') 
{ 
    $url = 'http://' . $url; 
} 

現在我們運行但是,這是它獲得的因爲域名的構建方式很複雜,您可以擁有1,2,3,4,5,6 ..。域級別,這意味着您無法從所有網址中檢測到域名,您必須具有預編譯列表的tld的檢查域的最後一部分,所以你可以分機留下該網站的域名。

有可以在這裏找到一個列表:http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

但你會分析這個名單到MySQL的更好,然後選擇其中TLD域名字符串的左側相匹配的行。

然後您訂購的長度,限制爲1,如果被發現,那麼你可以這樣做:

$db_found_tld = 'co.uk'; 
$domain = 'a.b.c.domain.co.uk'; 
$domain_name = substr($domain,0 - strlen($db_found_tld)); 

這將使a.b.c.domain,所以你已經刪除了頂級域名,目前該域名將提取像這樣:

$parts = explode($domain_name); 
$base_domain = $parts[count($parts) - 1]; 

現在你有domain

這似乎很漫長,但我希望現在你知道,不容易得到沒有tld或子域的域名。