Лучший способ проверить, действительно ли URL

Я хочу использовать PHP для проверки, если строка, хранящаяся в переменной $myoutput содержит действительный синтаксис ссылки или это обычный текст. Функция или решение, которые я ищу, должны распознавать все форматы ссылок, включая те, которые имеют параметры GET.

Решение, предложенное на многих сайтах, для фактического запроса строки (с использованием функции CURL или file_get_contents() ) в моем случае невозможно, и я хотел бы избежать этого.

Я думал о регулярных выражениях или другом решении.

Вы можете использовать собственный фильтр Validator

 filter_var($url, FILTER_VALIDATE_URL); 

Проверяет значение как URL (в соответствии с » http://www.faqs.org/rfcs/rfc2396 ), необязательно с необходимыми компонентами. Остерегайтесь действительного URL-адреса, который не может указывать HTTP-протокол http: //, поэтому для определения URL-адреса используется ожидаемый протокол, например, ssh: // или mailto :. Обратите внимание, что функция будет использовать только URL-адреса ASCII, чтобы они были действительными; интернационализированные доменные имена (содержащие символы, отличные от ASCII) не удастся.

Пример:

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

Вот лучший учебник, который я нашел там:

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") 

Использование filter_var () не будет выполняться для URL-адресов с символами не-ascii, например ( http://pt.wikipedia.org/wiki/Guimarães ). Следующая функция кодирует все символы не-ascii (например, http://pt.wikipedia.org/wiki/Guimar%C3%A3es ) перед вызовом filter_var ().

Надеюсь, это поможет кому-то.

 <?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://img.ruphp.com/php/f")) { echo "NOT A URL"; } else { echo "IS A URL"; } 
 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; } } 

Вы можете использовать эту функцию, но она вернет false, если веб-сайт отключен.

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

Еще один способ проверить, действительно ли заданный URL-адрес – попытаться получить к нему доступ, ниже функция будет извлекать заголовки из заданного URL-адреса, это гарантирует, что URL-адрес действителен и веб-сервер жив:

 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 )*/ } 

Лично я хотел бы использовать регулярное выражение здесь. Полноценный код отлично работал для меня.

 $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+!*(),;?&=\$_.-]+)?@)?"; // User and Pass Check $regularExpression .= "([a-z0-9-.]*)\.([az]{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://)+@i",'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; } } 

Учитывая проблемы с filter_var (), которые нуждаются в http: //, я использую:

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