2009-08-19 41 views
1

我需要找到最好的方式(就性能而言)來查找給定的字符串是否爲URL。
REGEXP不起作用,因爲www.eeeeeeeeeeeeeeeee.bbbbbbbbbbbbbbbbb.com是一個有效的url名稱,但不在任何人所知的網絡中。
我想使用CURL,看看我是否得到狀態​​200或只是file_get_contents並分析結果。
有沒有更好的方法?如何驗證給定的字符串是一個真正的URL,在PHP中?

+0

你可能會得到301,302和其他一些有效的代碼,所以不要只檢查200. – 2009-08-19 20:45:10

+5

我很想註冊和託管該域名,只是爲了證明你錯了:p – jason 2009-08-19 20:50:18

+0

不這樣做,我的意思是www.eeeeeeeeeeeeeeeeee.bbbbbbbbbbbbbb.com而不是www.eeeeeeeeeeeeeeee.bbbbbbbbbbbbbbbbb.com – 2009-08-20 00:45:58

回答

7

不要獲取整個內容 - 這可能是巨大的。改爲發出HEAD請求。

當然,你可以先做一些驗證 - 刪除那些無效的URL,而不僅僅是目前沒有任何服務的URL。之後,發出一個HEAD請求就像它獲得的一樣好。話雖如此,它變成了一個灰色區域......那麼返回「需要授權」的URL呢?這可能是一個密碼保護目錄,但如果你知道密碼,你最好然後拿回404,因爲文件本身不存在...

0
$host != gethostbyname($host) 

檢查主機。

4

This文章概述瞭如何從php執行DNS請求。這可能是最快的選擇,雖然它不會告訴你任何事情,如服務器是否在線,找到文件等。但它會告訴你,該網址已註冊到IP。這取決於你是否會適合你的「有效」

1

定義你不是說一個URL,你的意思是一個域名

0

我會使用curl只是頭,不獲取任何內容的強烈建議。

這裏是函數,我用來驗證給定的URL是否有效並找到。

function __checkUrl($url) 
{ 
    //First checking with pattern whether it is proper or not 
    $pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/'; 
    if (preg_match($pattern, $url)) 
    { 
     $ch = curl_init(); 

     // set URL and other appropriate options 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_MAXREDIRS, 3); 
     curl_setopt($ch, CURLOPT_NOBODY, true); 
     curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
     curl_setopt($ch, CURLOPT_FORBID_REUSE, true); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 4); 

     // grab URL 
     $output = curl_exec($ch); 
     // Get response code 
     $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 

     // Not found? 
     if ($response_code == '404') { 
      return false; 
     } else { 
      return $newurl; 
     } 
    } 
    else 
    { 
     return false; 
    } 
} 

有了這個函數,我首先檢查URL實際上是否與Regex有效。之後,蜷縮着。通過將CURLOPT_FOLLOWLOCATION設置爲true,我們正在處理301和類似的重定向,但限制了no。重定向到3. 最後我們在所有重定向之後返回有效URL。

希望這會有所幫助。

+0

你知道URL驗證正則表達式是相當虛假的,對吧? (正如在OP的問題中暗示的那樣) – bobince 2009-08-19 22:09:03

+0

這是第一個答案中描述的「頭部」請求,還是在這裏提取整個頁面? – 2009-08-20 02:59:48

+0

@Itay Moav:curl_setopt($ ch,CURLOPT_NOBODY,true); - 導致curl發送HEAD請求。 – GZipp 2009-08-20 12:33:44

相關問題