>백엔드 개발 >PHP 튜토리얼 >PHP에서 URL을 구문 분석하는 2가지 방법

PHP에서 URL을 구문 분석하는 2가지 방법

墨辰丷
墨辰丷원래의
2018-06-13 10:57:092123검색

이 글에서는 주로 PHP에서 URL을 구문 분석하는 두 가지 방법(parse_url 및 parse_str)을 소개하고 이 두 가지 방법의 소개와 사용법을 소개하며 도움이 필요한 친구들에게 권장됩니다.

PHP에는 URL을 구문 분석하는 데 사용할 수 있는 두 가지 메서드, 즉parse_url과parse_str이 있습니다.

parse_urlURL을 구문 분석하고 해당 구성 요소를 반환합니다.

혼합 구문 분석 URL(string $url [, int $comComponent = -1 ] )

이 함수는 URL을 구문 분석하고 URL 종류의 구성 요소입니다.

이 기능은 주어진 URL의 유효성을 확인하는 데 사용되지 않고 아래 나열된 부분으로 분류하는 데 사용됩니다. 불완전한 URL도 허용되며,parse_url()은 이를 가능한 한 정확하게 구문 분석하려고 시도합니다.

Parameters

url 구문 분석할 URL입니다. 유효하지 않은 문자는 _로 대체됩니다.

comComponent PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY 또는 PHP_URL_FRAGMENT 중 하나를 지정하여 URL의 지정된 부분에 대한 문자열을 가져옵니다. (PHP_URL_PORT로 지정한 경우를 제외하면 정수값이 반환됩니다.)

반환 값

심각하게 자격이 없는 URL의 경우,parse_url()은 FALSE를 반환할 수 있습니다.

구성요소 매개변수를 생략하면 연관 배열 배열이 반환되며 현재 배열에 하나 이상의 요소가 포함됩니다. 배열에 가능한 키는 다음과 같습니다.

scheme - http
host
port
user
pass
path
query - 물음표 뒤 ?
fragment - 해시 기호 뒤 #
구성 요소 매개변수가 지정된 경우,parse_url() 배열 대신 문자열(또는 PHP_URL_PORT로 지정된 경우 정수)을 반환합니다. URL에 지정된 구성 요소가 없으면 NULL이 반환됩니다.

Instance

코드는 다음과 같습니다.

<?php
$url = &#39;http://username:password@hostname/path?arg=value#anchor&#39;;
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>

위 루틴의 출력은 다음과 같습니다.

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

parse_str

문자열을 여러 변수로 구문 분석

void parse_str ( string $str [, array &$arr ] )

str이 URL로 전달된 쿼리 문자열인 경우 이를 변수로 구문 분석하고 현재 범위로 설정합니다.

현재 QUERY_STRING을 얻으려면 $_SERVER['QUERY_STRING'] 변수를 사용할 수 있습니다.

Parameter

str 입력 문자열입니다.

arr 두 번째 변수 arr이 설정되면 변수는 대신 이 배열에 배열 요소로 저장됩니다. ,

Example

코드는 다음과 같습니다.

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output[&#39;first&#39;];  // value
echo $output[&#39;arr&#39;][0]; // foo bar
echo $output[&#39;arr&#39;][1]; // baz
?>

얼마전에 php-resque의 소스코드를 읽다가 이 두 가지 방법을 적용한 것을 보고 설정을 파싱하는데 매우 유용하다고 느꼈습니다. 레디스 링크.

redis 링크 형식은 redis://user:pass@host:port/db?option1=val1&option2=val2 입니다. URL과 동일하니 위의 두 가지 방법을 이용하시면 쉽게 파싱하실 수 있습니다.

주소: https://github.com/chrisboulton/php-resque/blob/master/lib/Resque/Redis.php

코드는 다음과 같습니다.

 /**
     * Parse a DSN string, which can have one of the following formats:
     *
     * - host:port
     * - redis://user:pass@host:port/db?option1=val1&option2=val2
     * - tcp://user:pass@host:port/db?option1=val1&option2=val2
     *
     * Note: the &#39;user&#39; part of the DSN is not used.
     *
     * @param string $dsn A DSN string
     * @return array An array of DSN compotnents, with &#39;false&#39; values for any unknown components. e.g.
     *               [host, port, db, user, pass, options]
     */
    public static function parseDsn($dsn)
    {
        if ($dsn == &#39;&#39;) {
            // Use a sensible default for an empty DNS string
            $dsn = &#39;redis://&#39; . self::DEFAULT_HOST;
        }
        $parts = parse_url($dsn);
        // Check the URI scheme
        $validSchemes = array(&#39;redis&#39;, &#39;tcp&#39;);
        if (isset($parts[&#39;scheme&#39;]) && ! in_array($parts[&#39;scheme&#39;], $validSchemes)) {
            throw new \InvalidArgumentException("Invalid DSN. Supported schemes are " . implode(&#39;, &#39;, $validSchemes));
        }
        // Allow simple &#39;hostname&#39; format, which `parse_url` treats as a path, not host.
        if ( ! isset($parts[&#39;host&#39;]) && isset($parts[&#39;path&#39;])) {
            $parts[&#39;host&#39;] = $parts[&#39;path&#39;];
            unset($parts[&#39;path&#39;]);
        }
        // Extract the port number as an integer
        $port = isset($parts[&#39;port&#39;]) ? intval($parts[&#39;port&#39;]) : self::DEFAULT_PORT;
        // Get the database from the &#39;path&#39; part of the URI
        $database = false;
        if (isset($parts[&#39;path&#39;])) {
            // Strip non-digit chars from path
            $database = intval(preg_replace(&#39;/[^0-9]/&#39;, &#39;&#39;, $parts[&#39;path&#39;]));
        }
        // Extract any &#39;user&#39; and &#39;pass&#39; values
        $user = isset($parts[&#39;user&#39;]) ? $parts[&#39;user&#39;] : false;
        $pass = isset($parts[&#39;pass&#39;]) ? $parts[&#39;pass&#39;] : false;
        // Convert the query string into an associative array
        $options = array();
        if (isset($parts[&#39;query&#39;])) {
            // Parse the query string into an array
            parse_str($parts[&#39;query&#39;], $options);
        }
        return array(
            $parts[&#39;host&#39;],
            $port,
            $database,
            $user,
            $pass,
            $options,
        );
    }

요약: 위 내용은 전체 내용입니다 이 글이 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 권장 사항:

php array_merge() 함수를 사용하여 두 배열을 병합하는 방법

PHP에서 다양한 크기의 로고를 일괄 생성하는 방법

PHP에서 pcntl 함수를 사용하여 여러 프로세스를 작동하는 방법

위 내용은 PHP에서 URL을 구문 분석하는 2가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.