PHP Tips | 文字列処理:フォーマット – URL デコード

PHP PHP
スポンサーリンク

「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つあります。

  • urldecode
  • rawurldecode

これらの違いと、実務での使い方を、初心者向けに整理していきます。


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 や +)」を、人間が読める元の文字列に戻す処理。
  • urlencodeurldecoderawurlencoderawurldecode がペア。
  • 実務では、rawurlencoderawurldecode の組み合わせを使う場面が多い。
  • URL 全体ではなく、「パラメータの値」「パスの一要素」など、部分に対して使うイメージを持つ。
  • エンコード/デコードのタイミングを決めておき、二重エンコード・二重デコードを避ける。

タイトルとURLをコピーしました