天天看點

PHP:解析url和查詢參數query

解析url資訊

<?php

$url = 'https://www.php.net/manual/zh/language.types.php?name=Tom&age=23';

// 方式一:parse_url
print_r(parse_url($url));
// Array
// (
//     [scheme] => https
//     [host] => www.php.net
//     [path] => /manual/zh/language.types.php
//     [query] => name=Tom&age=23
// )


// 方式二:pathinfo
print_r(pathinfo($url));
// Array
// (
//     [dirname] => https://www.php.net/manual/zh
//     [basename] => language.types.php?name=Tom&age=23
//     [extension] => php?name=Tom&age=23
//     [filename] => language.types
// )


// 方式三:basename
print_r(basename($url));
// language.types.php?name=Tom&age=23      

解析查詢參數

<?php

/**
 * 将字元串參數變為數組
 * @param $query string
 * @return array
 * */
function decodeUrlQuery($query_str)
{
    $query_pairs = explode('&', $query_str);
    $params = [];
    foreach ($query_pairs as $query_pair) {
        $item = explode('=', $query_pair);
        $params[$item[0]] = $item[1];
    }
    return $params;
}
/**
 * 将參數變為字元串
 * @param $query_array array
 * @return string 
 */
function encodeUrlQuery($query_array)
{
    $tmp = array();
    foreach ($query_array as $key => $value) {
        $tmp[] = $key . '=' . $value;
    }

    return implode('&', $tmp);
}

// 示例
$url = 'https://www.php.net/manual/zh/language.types.php?name=Tom&age=23';

// 字元串轉數組
$query_str = parse_url($url)['query'];
$query_array = decodeUrlQuery($query_str);
print_r($query_array);
// Array
// (
//     [name] => Tom
//     [age] => 23
// )


// 數組轉字元串
print_r(encodeUrlQuery($query_array));
// name=Tom&age=23      

擴充:查詢字元串編碼

使用php自帶的查詢參數編碼函數

$data = [
    'name' => 'Tom',
    'age'  => 23
];

echo encodeUrlQuery($data) . PHP_EOL;
// name=Tom&age=23

echo  http_build_query($data) . PHP_EOL;
// name=Tom&age=23      

如果是中文字元就會被編碼

$data = [
    'name' => '湯姆',
    'age' => 23
];

echo encodeUrlQuery($data) . PHP_EOL;
// name=湯姆&age=23

echo  http_build_query($data) . PHP_EOL;
// name=%E6%B1%A4%E5%A7%86&age=23      

參考

​​php解析url并得到url中的參數及擷取url參數的四種方式​​