2010-01-13 142 views
98

我想用PHP來檢查,如果存儲在$myoutput變量中的字符串包含有效的鏈接語法,或者它只是一個普通的文本。我正在尋找的功能或解決方案應能識別所有鏈接格式,包括帶有GET參數的鏈接格式。最好的方法來檢查一個URL是否有效

許多網站上建議的解決方案實際上查詢字符串(使用CURL或file_get_contents()函數)在我的情況下是不可能的,我想避免它。

我想過正則表達式或其他解決方案。

+0

使用curl或得到它的HTTP內容可能會很慢,如果你想要更多的東西迅速和幾乎一樣可靠的,考慮在主機名上使用gethostbyaddr()。如果它解析爲IP,那麼它可能有一個網站。當然這取決於你的需求。 – TravisO 2010-01-13 18:28:29

回答

198

可以使用天然Filter Validator

filter_var($url, FILTER_VALIDATE_URL); 

void驗證值作爲URL(根據»http://www.faqs.org/rfcs/rfc2396),任選地與所需的組件。請注意,有效的網址可能不會指定HTTP協議http://,因此可能需要進一步的驗證以確定網址使用預期的協議,例如, ssh://或mailto :.請注意,該函數只會發現ASCII URL有效;國際化域名(包含非ASCII字符)將失敗。

例子:

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) { 
    die('Not a valid URL'); 
} 
+7

它也允許像'http:// example'這樣的url(thik'localhost'是一個url) – raveren 2011-10-14 13:23:57

+5

@Raveren預期的行爲,因爲這些是有效的URL。 – Gordon 2011-10-14 13:38:56

+6

請注意'FILTER_VALIDATE_URL'不會驗證url的協議。所以'ssh://','ftp://'等會通過。 – Seph 2014-05-10 14:03:25

4
function is_url($uri){ 
    if(preg_match('/^(http|https):\\/\\/[a-z0-9_]+([\\-\\.]{1}[a-z_0-9]+)*\\.[_a-z]{2,5}'.'((:[0-9]{1,5})?\\/.*)?$/i' ,$uri)){ 
     return $uri; 
    } 
    else{ 
     return false; 
    } 
} 
+2

那麼怎麼樣:'http:// 192.168.1.12'或'http:// 192.168.1.12/some-page'? – Haudegen 2016-03-01 13:20:24

2

您可以使用此功能,但如果網站下線的將返回false。

function isValidUrl($url) { 
    $url = parse_url($url); 
    if (!isset($url["host"])) return false; 
    return !(gethostbyname($url["host"]) == $url["host"]); 
} 
6

這是我在那兒找到的最好的教程:

http://www.w3schools.com/php/filter_validate_url.asp

<?php 
$url = "http://www.qbaki.com"; 

// Remove all illegal characters from a url 
$url = filter_var($url, FILTER_SANITIZE_URL); 

// Validate url 
if (!filter_var($url, FILTER_VALIDATE_URL) === false) { 
echo("$url is a valid URL"); 
} else { 
echo("$url is not a valid URL"); 
} 
?> 

可能的標誌:

FILTER_FLAG_SCHEME_REQUIRED - URL must be RFC compliant (like http://example) 
FILTER_FLAG_HOST_REQUIRED - URL must include host name (like http://www.example.com) 
FILTER_FLAG_PATH_REQUIRED - URL must have a path after the domain name (like www.example.com/example1/) 
FILTER_FLAG_QUERY_REQUIRED - URL must have a query string (like "example.php?name=Peter&age=37") 
1

檢查,如果給定的URL是有效的是另一種方式嘗試訪問它,下面的函數將從給定的URL獲取標題,這將確保網址是有效 Web服務器是活着:

function is_url($url){ 
     $response = array(); 
     //Check if URL is empty 
     if(!empty($url)) { 
      $response = get_headers($url); 
     } 
     return (bool)in_array("HTTP/1.1 200 OK", $response, true); 
/*Array 
(
    [0] => HTTP/1.1 200 OK 
    [Date] => Sat, 29 May 2004 12:28:14 GMT 
    [Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux) 
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT 
    [ETag] => "3f80f-1b6-3e1cb03b" 
    [Accept-Ranges] => bytes 
    [Content-Length] => 438 
    [Connection] => close 
    [Content-Type] => text/html 
)*/ 
    } 
+0

好主意。如果服務器使用HTTP/1.0或HTTP/2.0,或者返回重定向,這將失敗。 – iblamefish 2017-02-23 08:16:10

+0

是的,這是一個起點,可以輕鬆完成進一步的改進。 – bodi0 2017-02-23 08:31:16

5

使用filter_var()將與非ASCII字符,例如網址失敗(http://pt.wikipedia.org/wiki/Guimarães)。以下函數在調用filter_var()之前對所有非A​​SCII字符(例如http://pt.wikipedia.org/wiki/Guimar%C3%A3es)進行編碼。

希望這可以幫助別人。

<?php 

function validate_url($url) { 
    $path = parse_url($url, PHP_URL_PATH); 
    $encoded_path = array_map('urlencode', explode('/', $path)); 
    $url = str_replace($path, implode('/', $encoded_path), $url); 

    return filter_var($url, FILTER_VALIDATE_URL) ? true : false; 
} 

// example 
if(!validate_url("http://somedomain.com/some/path/file1.jpg")) { 
    echo "NOT A URL"; 
} 
else { 
    echo "IS A URL"; 
} 
0

我個人想在這裏使用正則表達式。貝婁碼完全爲我工作。

$baseUrl  = url('/'); // for my case https://www.xrepeater.com 
$posted_url = "home"; 
// Test with one by one 
/*$posted_url = "/home"; 
$posted_url = "xrepeater.com"; 
$posted_url = "www.xrepeater.com"; 
$posted_url = "http://www.xrepeater.com"; 
$posted_url = "https://www.xrepeater.com"; 
$posted_url = "https://xrepeater.com/services"; 
$posted_url = "xrepeater.dev/home/test"; 
$posted_url = "home/test";*/ 

$regularExpression = "((https?|ftp)\:\/\/)?"; // SCHEME Check 
$regularExpression .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass Check 
$regularExpression .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP Check 
$regularExpression .= "(\:[0-9]{2,5})?"; // Port Check 
$regularExpression .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path Check 
$regularExpression .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query String Check 
$regularExpression .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor Check 

if(preg_match("/^$regularExpression$/i", $posted_url)) { 
    if(preg_match("@^http|https://@i",$posted_url)) { 
     $final_url = preg_replace("@(http://)[email protected]",'http://',$posted_url); 
     // return "*** - ***Match : ".$final_url; 
    } 
    else { 
      $final_url = 'http://'.$posted_url; 
      // return "***/***Match : ".$final_url; 
     } 
    } 
else { 
    if (substr($posted_url, 0, 1) === '/') { 
     // return "***/***Not Match :".$final_url."<br>".$baseUrl.$posted_url; 
     $final_url = $baseUrl.$posted_url; 
    } 
    else { 
     // return "*** - ***Not Match :".$posted_url."<br>".$baseUrl."/".$posted_url; 
     $final_url = $baseUrl."/".$final_url; } 
} 
1

鑑於問題與filter_var()需要的http://,我使用:

$is_url = filter_var($filename, FILTER_VALIDATE_URL) || array_key_exists('scheme', parse_url($filename));

相關問題