「URL デコード」で何をしたいのかイメージする
前回の「URL エンコード」は、
「生の文字列 → URL 用に安全な文字列(%E3%81…)」への変換でした。
URL デコードは、その逆です。
"Hello%20PHP%20%26%20URL" → "Hello PHP & URL"
"%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF" → "こんにちは"
"PHP+URL+encode" → "PHP URL encode"(※場合による)
つまり、
「URL の中に入っているエンコード済みの文字列」を、
人間が読める元の文字列に戻す処理
が「URL デコード」です。
PHP には、エンコードと対になる関数が2つあります。
urldecoderawurldecode
これらの違いと、実務での使い方を、初心者向けに整理していきます。
PHP の URL デコードの基本:urldecode と rawurldecode
urldecode の特徴(urlencode の逆)
urldecode は、urlencode の逆変換です。
%XXを元の文字に戻す+をスペース' 'に戻す
というルールで動きます。
$encoded = "PHP+URL+encode+test+1%2B2";
echo urldecode($encoded);
// PHP URL encode test 1+2
PHP+ がスペースに戻り、%2B が + に戻っているのが分かります。
urlencode とセットで使うとき(古いフォーム形式など)に対応する関数です。
rawurldecode の特徴(rawurlencode の逆)
rawurldecode は、rawurlencode の逆変換です。
%XXを元の文字に戻す+はそのまま+(スペースにはしない)
というルールで動きます。
$encoded = "PHP%20URL%20encode%20test%201%2B2";
echo rawurldecode($encoded);
// PHP URL encode test 1+2
PHPスペースは %20 → ' ' に戻り、%2B は + に戻りますが、+ 自体は特別扱いされません。
rawurlencode とセットで使うのが基本です。
どっちを使えばいいか(エンコードとの対応が超重要)
原則:「エンコードに合わせてデコードを選ぶ」
ここが一番大事なポイントです。
urlencodeでエンコードしたものは、urldecodeで戻すrawurlencodeでエンコードしたものは、rawurldecodeで戻す
この「ペア」を崩さないことが、とても重要です。
例えば、こうです。
$original = "PHP URL encode test 1 2 3";
$enc1 = urlencode($original);
$dec1 = urldecode($enc1);
$enc2 = rawurlencode($original);
$dec2 = rawurldecode($enc2);
echo $enc1 . "\n"; // PHP+URL+encode+test+1+2+3
echo $dec1 . "\n"; // PHP URL encode test 1 2 3
echo $enc2 . "\n"; // PHP%20URL%20encode%20test%201%202%203
echo $dec2 . "\n"; // PHP URL encode test 1 2 3
PHPどちらも「元の文字列」に戻っています。
逆に、ペアを間違えると、スペースと + の扱いでおかしくなります。
$original = "A B+C";
$enc = urlencode($original); // A+B%2BC
echo $enc . "\n"; // A+B%2BC
echo rawurldecode($enc) . "\n";
// A B+C ← たまたま見た目は同じに見えるが、ケースによってはズレる
PHP実務では、
「自分のコードの中でエンコードしたものを戻す」
→ そのときに使った関数とペアのデコード関数を使う
と覚えておけば OK です。
具体例で URL デコードの使いどころをイメージする
例1:クエリパラメータを自前で解析する場合
通常は $_GET を使えば PHP が勝手にデコードしてくれますが、
ログ解析や特殊な処理で、自分でクエリ文字列を扱うこともあります。
$query = "q=PHP%20URL%20encode%20test&lang=ja";
// "q=..." の部分だけ取り出したと仮定
$encodedValue = "PHP%20URL%20encode%20test";
$decoded = rawurldecode($encodedValue);
echo $decoded;
// PHP URL encode test
PHP「URL の中にあるエンコード済みの値」を、
人間が読める形に戻したいときに使います。
例2:ログに残っている URL を読みやすくする
アクセスログなどには、エンコード済みの URL がそのまま残っていることがあります。
$loggedUrl = "/search?q=%E3%83%86%E3%82%B9%E3%83%88&lang=ja";
// クエリ部分だけ取り出したと仮定
$encodedQuery = "%E3%83%86%E3%82%B9%E3%83%88";
echo rawurldecode($encodedQuery);
// テスト
PHP日本語部分が %E3%83... のようになっていると読みにくいので、rawurldecode で戻してからログを分析すると、かなり楽になります。
実務ユーティリティとして関数にまとめる
クエリパラメータ値をデコードするユーティリティ
「クエリパラメータの値をデコードする」という用途に絞った関数を作ると、
呼び出し側の意図が分かりやすくなります。
/**
* クエリパラメータの値を URL デコードする(rawurlencode 前提)
*/
function decodeQueryValue(string $value): string
{
return rawurldecode($value);
}
PHP使い方のイメージです。
$encoded = "PHP%20URL%20encode%20test";
echo decodeQueryValue($encoded);
// PHP URL encode test
PHP「ここではクエリの値をデコードしているんだな」という意図が、
関数名から読み取れるのがポイントです。
「エンコード+デコード」をセットで扱うユーティリティ
エンコードとデコードをセットでまとめておくと、
ペアを間違えにくくなります。
function encodeQueryValue(string $value): string
{
return rawurlencode($value);
}
function decodeQueryValue(string $value): string
{
return rawurldecode($value);
}
PHPこうしておけば、
- 「クエリ用のエンコード/デコードはこの2つだけを使う」
- 「他の場所では触らない」
というルールにしやすくなります。
重要ポイントの深掘り:やってはいけないこと
URL 全体を丸ごとデコードしないといけない場面は少ない
エンコードのときと同じで、
「URL 全体」を一気にデコードするのは、あまり良い設計ではありません。
$url = "https://example.com/search?q=%E3%83%86%E3%82%B9%E3%83%88&lang=ja";
echo rawurldecode($url);
// https://example.com/search?q=テスト&lang=ja
PHP見た目は分かりやすくなりますが、
その後また URL として使うなら、
「どこまでがエンコード済みだったか」が分からなくなり、
再エンコードのタイミングで混乱しがちです。
基本的には、
「URL の中の、エンコード済みの値だけをデコードする」
という単位で使う方が安全です。
二重デコードしない
エンコードと同じく、「二重デコード」も危険です。
$original = "A B";
$encoded = rawurlencode($original); // A%20B
$decoded1 = rawurldecode($encoded); // A B
$decoded2 = rawurldecode($decoded1); // A B(たまたま変化しない)
// しかし、もともと % を含む文字列などでは壊れる可能性がある
PHP「どこでデコードするか」を決めておかないと、
同じ値に対して何度もデコードをかけてしまい、
意図しない変換が起きることがあります。
設計としては、
- 「入力直後に一度だけデコードする」
- それ以降は「生の文字列」として扱う
というルールを決めておくと、混乱を防げます。
まとめ:今日からの「URL デコード」ユーティリティ
押さえておきたいポイントをコンパクトにまとめます。
URL デコードは、
- 「URL 用にエンコードされた文字列(%XX や +)」を、人間が読める元の文字列に戻す処理。
urlencode↔urldecode、rawurlencode↔rawurldecodeがペア。- 実務では、
rawurlencodeとrawurldecodeの組み合わせを使う場面が多い。 - URL 全体ではなく、「パラメータの値」「パスの一要素」など、部分に対して使うイメージを持つ。
- エンコード/デコードのタイミングを決めておき、二重エンコード・二重デコードを避ける。
