Web 開發頻繁處理 URL 編碼、解析、遠端 Header 獲取等需求。PHP 內建 URL 相關函數功能強大,本文系統整理 base64、get_headers、get_meta_tags、http_build_query、parse_url、urlencode/rawurlencode 等核心函數,附實戰範例。
$str = 'Hello PHP 中文';
$enc = base64_encode($str); // SGVsbG8gUEhQIOS4lueVjA==
$dec = base64_decode($enc); // Hello PHP 中文
// URL 安全 Base64(無 + / =)
$safe = rtrim(strtr(base64_encode($str), '+/', '-_'), '=');
$orig = base64_decode(strtr($safe, '-_', '+/'));
$url = 'https://api.github.com/users/octocat';
// 索引陣列
$headers = get_headers($url);
print_r($headers);
/*
Array
(
[0] => HTTP/2 200
[1] => server: GitHub.com
[2] => date: Mon, 20 May 2024 12:00:00 GMT
...
)
*/
// 關聯陣列(format=1)
$assoc = get_headers($url, 1);
echo $assoc['Content-Type']; // application/json; charset=utf-8
echo $assoc['Server']; // GitHub.com
$url = 'https://www.php.net';
$meta = get_meta_tags($url);
print_r($meta);
/*
Array
(
[description] => PHP is a popular general-purpose scripting language...
[keywords] => PHP, scripting, language, web development
[generator] => Hugo 0.120.0
[viewport] => width=device-width, initial-scale=1.0
)
*/
// 注意:需 allow_url_fopen=On,大型頁面建議用 cURL 取得 HTML 再用 DOMDocument 解析
$params = [
'category' => 'books',
'tags' => ['php', 'oop', 'design-patterns'],
'page' => 2,
'sort' => 'price_desc',
];
// 索引鍵自動編碼,值自動 urlencode
$query = http_build_query($params);
// category=books&tags%5B0%5D=php&tags%5B1%5D=oop&tags%5B2%5D=design-patterns&page=2&sort=price_desc
// 數字索引加前綴
$query = http_build_query(['apple', 'banana'], 'fruit_');
// fruit_0=apple&fruit_1=banana
// 反解析
parse_str($query, $out);
print_r($out);
$url = 'https://user:pass@api.example.com:8443/v1/users/123?active=1&role=admin#profile';
$parts = parse_url($url);
print_r($parts);
/*
Array
(
[scheme] => https
[host] => api.example.com
[port] => 8443
[user] => user
[pass] => pass
[path] => /v1/users/123
[query] => active=1&role=admin
[fragment] => profile
)
*/
// 只取特定部分
echo parse_url($url, PHP_URL_HOST); // api.example.com
echo parse_url($url, PHP_URL_PATH); // /v1/users/123
$raw = 'https://example.com/search?q=php 中文&page=1';
echo "urlencode: ", urlencode($raw), PHP_EOL;
// https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dphp+%E4%B8%AD%E6%96%87%26page%3D1
echo "rawurlencode: ", rawurlencode($raw), PHP_EOL;
// https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dphp%20%E4%B8%AD%E6%96%87%26page%3D1
// 關鍵差異:空格編碼
// urlencode -> + (application/x-www-form-urlencoded 標準)
// rawurlencode -> %20 (RFC 3986 標準,URL 路徑/片段建議)
// 解碼對應
urldecode($enc); // 對應 urlencode
rawurldecode($enc); // 對應 rawurlencode
function buildSignature(array $params, string $secret): string {
ksort($params);
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986); // PHP 5.4+
return hash_hmac('sha256', $query, $secret);
}
function safeRedirect(string $target, array $allowedHosts): void {
$parts = parse_url($target);
if (!isset($parts['host']) || !in_array($parts['host'], $allowedHosts, true)) {
$target = '/'; // fallback
}
header("Location: $target", true, 302);
exit;
}
function dataUri(string $file, string $mime): string {
return 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($file));
}
掌握 parse_url 解析、http_build_query 組裝、rawurlencode 標準編碼、get_headers 偵測、base64 傳輸編碼,即可應付 95% URL 處理場景。注意 allow_url_fopen 安全性,遠端請求優先使用 cURL/Guzzle 並設定逾時與驗證。