首頁 >後端開發 >php教程 >php中2個解析URL的方法

php中2個解析URL的方法

墨辰丷
墨辰丷原創
2018-06-13 10:57:092100瀏覽

本文主要向大家介紹了php中2個解析URL的方法(parse_url和parse_str),以及這2種方法的簡介和用法,十分全面,推薦給有需要的小夥伴們。

PHP中有兩個方法可以用來解析URL,分別是parse_url和parse_str。

parse_url解析URL,傳回其組成部分

mixed parse_url ( string $url [, int $component = -1 ] )

本函數解析一個URL 並傳回一個關聯數組,包含在URL 中出現的各種組成部分。

本函數不是用來驗證給定 URL 的合法性的,只是將其分解為下面列出的部分。不完整的 URL 也被接受,parse_url() 會嘗試盡量正確地將其解析。

參數

url  要解析的 URL。無效字元將使用 _ 來替換。

component  指定 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 中指定的部分的 string。 (除了指定為 PHP_URL_PORT 後,將傳回一個 integer 的值)。

傳回值

對嚴重不合格的 URL,parse_url() 可能會傳回 FALSE。

如果省略了 component 參數,將會傳回一個關聯陣列 array,在目前至少會有一個元素在該陣列中。陣列中可能的鍵有以下幾種:

scheme - 如http
host
port
user
pass
path
query - 問號? 之後
fragment - 在雜湊符號# 之後
如果指定了component 參數,parse_url() 傳回一個string (或在指定為PHP_URL_PORT 時傳回一個integer)而不是array。如果 URL 中指定的組成部分不存在,則會傳回 NULL。

實例

程式碼如下:

<?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),則將它解析為變數並設定到當前作用域。

取得目前的 QUERY_STRING,你可以使用 $_SERVER['QUERY_STRING'] 變數。

參數

str  輸入的字串。

arr  如果設定了第二個變數 arr,變數將會以陣列元素的形式存入這個陣列,作為替代。 、

實例

程式碼如下:

<?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連結的格式是: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實作批次產生各種尺寸Logo的方法

PHP使用pcntl函數操作多進程的方法

#

以上是php中2個解析URL的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn