IT박스

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

itboxs 2020. 6. 27. 11:48
반응형

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


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

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

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


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

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');
}

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

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

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

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

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

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


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

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

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

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

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

Came across this article from 2012. It takes into account variables that may or may not be just plain URLs.

The author of the article, David Müeller, provides this function that he says, "...could be worth wile [sic]," along with some examples of filter_var and its shortcomings.

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

참고URL : https://stackoverflow.com/questions/2058578/best-way-to-check-if-a-url-is-valid

반응형