URL이 유효한지 확인하는 가장 좋은 방법


149

$myoutput변수에 저장된 문자열에 유효한 링크 구문이 포함되어 있는지 아니면 일반 텍스트 인지 PHP를 사용하여 확인하고 싶습니다 . 내가 찾고있는 기능이나 솔루션은 GET 매개 변수가있는 것을 포함하여 모든 링크 형식을 인식해야합니다.

많은 경우 실제로 CURL 또는 file_get_contents()함수를 사용하여 문자열을 쿼리하는 솔루션 은 가능하지 않으므로 피하고 싶습니다.

정규식이나 다른 해결책에 대해 생각했습니다.


보다 빠르고 안정적인 것을 원한다면 CURL을 사용하거나 HTTP 내용을 얻는 것이 느려질 수 있습니다. 호스트 이름에서 gethostbyaddr () 사용을 고려하십시오. IP로 확인되면 웹 사이트가있을 수 있습니다. 물론 이것은 당신의 필요에 달려 있습니다.
TravisO

답변:


301

기본 필터 검사기를 사용할 수 있습니다

filter_var($url, FILTER_VALIDATE_URL);

선택적으로 필요한 구성 요소를 사용 하여 값을 URL ( http://www.faqs.org/rfcs/rfc2396 에 따라)로 확인합니다 . 유효한 URL이 HTTP 프로토콜 http : //를 지정하지 않을 수 있으므로 URL이 예상 프로토콜 (예 : ssh : // 또는 mailto :)을 사용하는지 확인하려면 추가 검증이 필요할 수 있습니다. 이 함수는 유효한 ASCII URL 만 찾습니다. 국제화되지 않은 도메인 이름 (비 ASCII 문자 포함)이 실패합니다.

예:

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

9
@Raveren은 유효한 URL이기 때문에 예상되는 동작입니다.
Gordon

8
그주의 FILTER_VALIDATE_URL의 URL의 프로토콜을 확인하지 않습니다. 그래서 ssh://, ftp://등 전달합니다.
Seph

3
@SephVelut은 유효한 URL이므로 예상되는 동작입니다.
고든

1
그것은 ttp : //amazon.com 같은 URL을 허용합니다
Elia Weiss

4
@JoshHabdas, 요점을 놓친 것 같습니다. PHP 코드는 그것이 주장하는 것을 정확하게 수행합니다. 그러나 그것은 당신의 마음을 읽을 수 없습니다. 무효와 원치 않는 것에는 큰 차이가 있습니다. 원치 않는 것은 매우 주관적이므로 프로그래머가 세부 사항을 해결해야합니다. 코드가 URL의 유효성을 검사하지만 해당 URL이 존재한다는 것을 증명하지는 않습니다. 사용자가 유효성을 검사하지만 원치 않는 "amazon", "amozon"을 잘못 입력 한 것은 PHP의 잘못이 아닙니다.
JBH

20

내가 찾은 최고의 튜토리얼은 다음과 같습니다.

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
nit : !filter_var(...) === false==> filter_var(...) === true또는 just filter_var(...). :)
Domenico De Felice

@ ErichGarcía이 코드는 OP 요청과 같은 유효한 HTTP / S URL인지 확인하지 않습니다. 이것은 ssh를 같은 것들을 전달합니다 : // FTP : // 등이 단지 검사의 구문 적으로 유효한 URL이 RFC에 따라 경우 2396
트위그

FILTER_VALIDATE_URL을 사용하지 마십시오. 지저분하고 신뢰할 수 없습니다. 예 : ttps://www.youtube.com유효한 것으로 확인
Jeffz

12

ASCII가 아닌 문자가 포함 된 URL의 경우 filter_var () 사용이 실패합니다 (예 : ( http://pt.wikipedia.org/wiki/Guimarães ). 다음 함수는 filter_var ()를 호출하기 전에 ASCII가 아닌 모든 문자 (예 : 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";
}

이거 야. 마지막으로 누군가 2017 년에 돌아 왔습니다
Kyle KIM

나를 위해 일합니다 (다른 사람들은 BTW하지 않습니다) :)
Jono

이것은 나를 위해 일한 유일한 솔루션입니다. 감사!
Silas

10
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;
    }
}

3

개인적으로 나는 정규 표현식을 사용하고 싶습니다. 벨로우 코드는 완벽하게 작동했습니다.

$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-.]*)\.([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://)+@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; }
}

1
웹 사이트 URL을 확인하는 가장 좋은 방법입니다. 약간의 변경만으로도 완벽하게 작동합니다. 감사합니다
아미르 호세인 카리미

3

http : //가 필요한 filter_var ()에 문제가 있으면 다음을 사용합니다.

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


FILTER_VALIDATE_URL을 사용하지 마십시오. 지저분하고 신뢰할 수 없습니다. 예 : ttps://www.youtube.com유효한 것으로 확인
Jeffz

2

이 기능을 사용할 수 있지만 웹 사이트가 오프라인 인 경우 false를 반환합니다.

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


1

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

좋은 생각. 서버가 HTTP / 1.0 또는 HTTP / 2.0을 사용하거나 리디렉션을 반환하면 실패합니다.
iblamefish

그렇습니다. 시작점이므로 추가로 쉽게 개선 할 수 있습니다.
버드 Damyanov

1

2012 년 부터이 기사 를 살펴 보았습니다 . 단순한 URL 일 수도 있고 아닐 수도있는 변수를 고려 합니다.

이 기사의 저자 인 David Müeller 는이 기능을 제공합니다 filter_var.

/**
 * Modified version of `filter_var`.
 *
 * @param  mixed $url Could be a URL or possibly much more.
 * @return bool
 */
function validate_url( $url ) {
    $url = trim( $url );

    return (
        ( strpos( $url, 'http://' ) === 0 || strpos( $url, 'https://' ) === 0 ) &&
        filter_var(
            $url,
            FILTER_VALIDATE_URL,
            FILTER_FLAG_SCHEME_REQUIRED || FILTER_FLAG_HOST_REQUIRED
        ) !== false
    );
}

0

누구나 cURL을 사용하여 유효성 검사에 관심이있는 경우 다음 코드를 사용할 수 있습니다.

<?php 
public function validationUrl($Url){
        if ($Url == NULL){
            return $false;
        }
        $ch = curl_init($Url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return ($httpcode >= 200 && $httpcode < 300) ? true : false; 
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.