【PHP8.x】urldecode関数の使い方

urldecode関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

urldecode関数は、URLエンコードされた文字列をデコードする関数です。この関数は、Webブラウザのアドレスバーやフォームの送信などで使われるURLに、特殊な意味を持つ文字(例えば&=)や、日本語のようなマルチバイト文字が含まれている場合に、それらの文字が誤動作しないように%と16進数で表現された形式に変換されたものを、元の文字列に戻す役割を持っています。

具体的には、引数としてURLエンコードされた文字列を一つ受け取り、デコードされた新しい文字列を返します。例えば、スペースは+%20としてエンコードされますが、urldecode関数ではこれらを元のスペースに戻します。特に、+としてエンコードされたスペースも適切にデコードされる点が特徴です。

Webアプリケーションにおいて、ユーザーからの入力をURLパラメータとして受け取った際や、Cookieに保存されたURLエンコード済みのデータを読み込む際などに、元の意味を持つ文字列として扱うためにこの関数が広く利用されます。urlencode関数と対になる関数であり、安全にデータをやり取りするために不可欠な機能の一つです。この関数は、RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax) で定義されているURLエンコードのルールに基づいています。

構文(syntax)

1<?php
2$encoded_string = "Hello%20World%21";
3$decoded_string = urldecode($encoded_string);
4echo $decoded_string;
5?>

引数(parameters)

string $string

  • string $string: URLエンコードされた文字列

戻り値(return)

string

URLエンコードされた文字列をデコードした結果を文字列で返します。

サンプルコード

PHP urldecode() オンラインデモ

1<?php
2
3declare(strict_types=1);
4
5/**
6 * URLエンコードされた文字列をデコードするオンラインツールのサンプルです。
7 *
8 * このスクリプトは、Webフォームから送信された文字列を受け取り、
9 * urldecode() 関数を使用してデコードし、その結果を表示します。
10 * 1つのファイルで動作するように設計されています。
11 */
12
13// 初期化
14$encodedString = '';
15$decodedString = null;
16
17// HTTP POSTリクエストがあった場合のみ処理を実行
18if ($_SERVER['REQUEST_METHOD'] === 'POST') {
19    // フォームから 'encoded_string' の値を取得
20    $encodedString = $_POST['encoded_string'] ?? '';
21
22    if ($encodedString !== '') {
23        // urldecode() を使って文字列をデコードする
24        // 例: 'PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB' -> 'PHP サンプル'
25        $decodedString = urldecode($encodedString);
26    }
27}
28
29?>
30<!DOCTYPE html>
31<html lang="ja">
32<head>
33    <meta charset="UTF-8">
34    <title>PHP urldecode() Online Demo</title>
35    <style>
36        body { font-family: sans-serif; line-height: 1.6; padding: 2em; }
37        .container { max-width: 700px; margin: 0 auto; }
38        textarea { width: 100%; height: 120px; margin-bottom: 1em; }
39        button { padding: 0.5em 1.5em; }
40        pre { background-color: #f0f0f0; padding: 1em; border: 1px solid #ccc; white-space: pre-wrap; word-wrap: break-word; }
41    </style>
42</head>
43<body>
44    <div class="container">
45        <h1>PHP <code>urldecode()</code> オンラインデモ</h1>
46        <p>
47            URLエンコードされた文字列(例: <code>PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB</code>)を入力してデコードします。
48        </p>
49        <form action="" method="POST">
50            <div>
51                <label for="encoded_string">URLエンコードされた文字列:</label>
52                <textarea id="encoded_string" name="encoded_string"><?= htmlspecialchars($encodedString, ENT_QUOTES, 'UTF-8') ?></textarea>
53            </div>
54            <button type="submit">デコード実行</button>
55        </form>
56
57        <?php if ($decodedString !== null): ?>
58            <h2>デコード結果:</h2>
59            <pre><?= htmlspecialchars($decodedString, ENT_QUOTES, 'UTF-8') ?></pre>
60        <?php endif; ?>
61    </div>
62</body>
63</html>

PHPのurldecode()関数は、URLエンコードされた文字列を、人間が読める元の文字列に戻す(デコードする)ための関数です。URLエンコードとは、URLとして安全に送信するために、スペースが+記号に、日本語などのマルチバイト文字が%から始まる16進数コードに変換される処理のことです。urldecode()は、このエンコードされた文字列を元の状態に戻します。

この関数は、引数にデコードしたい文字列を1つ指定します。処理が成功すると、デコードされた文字列を戻り値として返します。

このサンプルコードは、urldecode()の動作を試せるオンラインツールです。WebページのフォームにURLエンコードされた文字列(例: PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)を入力し、送信ボタンを押します。すると、PHPスクリプトがその文字列をurldecode()関数で処理し、デコードされた結果(例: PHP サンプル)を画面に表示します。このように、WebアプリケーションでURLのパラメータやフォームから送信されたデータを扱う際に利用される重要な関数です。

urldecode()関数は、URLエンコードされた文字列を元の形に戻すためのものです。特に「%」で始まる16進数コードを文字に、プラス記号(+)を半角スペースに変換します。似た関数にrawurldecode()がありますが、こちらはプラス記号を変換しないという違いがあるため、用途に応じて使い分ける必要があります。このサンプルコードで最も重要な点は、ユーザーが入力した値を画面に表示する際にhtmlspecialchars()関数を使用していることです。これにより、悪意のあるスクリプトの埋め込み(クロスサイトスクリプティング)を防いでいます。また、$_POSTからの値の取得に?? ''と記述することで、未送信時のエラーを回避しており、安全なコードを書く上での良い実践例です。

urldecode()とrawurldecode()の違いを理解する

1<?php
2
3/**
4 * urldecode() と rawurldecode() の違いを示すサンプルコード。
5 *
6 * この関数は、URLエンコードされた文字列をデコードする際の
7 * 両関数の挙動の違い、特にプラス記号 ('+') の扱いに焦点を当てて説明します。
8 */
9function demonstrateUrlDecodeDifferences(): void
10{
11    // ケース1: スペースが '+' でエンコードされている可能性のあるフォームデータ形式の文字列
12    // (例: HTMLフォームの 'application/x-www-form-urlencoded' での送信データ)
13    // ここでは、実際のスペースは '+' で、リテラルの '+' は '%2B' で表現されています。
14    $encodedStringForm = "Search+Query%2BPHP";
15    echo "--- ケース1: 'Search+Query%2BPHP' (フォームデータ形式) ---\n";
16    echo "元のエンコードされた文字列: " . $encodedStringForm . "\n";
17    echo "urldecode() でデコード:    " . urldecode($encodedStringForm) . "\n";
18    echo "rawurldecode() でデコード: " . rawurldecode($encodedStringForm) . "\n";
19    echo "コメント: urldecode() は '+' をスペースに変換します。\n";
20    echo "          rawurldecode() は '+' をそのまま '+' として扱います。\n\n";
21
22    // ケース2: RFC 3986 に従ってエンコードされたURI形式の文字列
23    // (例: URIパスやクエリパラメータ)
24    // ここでは、スペースは '%20' で、リテラルの '+' は '%2B' で表現されています。
25    $encodedStringUri = "Path%2FTo%2FFile%20with%2Bplus";
26    echo "--- ケース2: 'Path%2FTo%2FFile%20with%2Bplus' (RFC 3986 URI形式) ---\n";
27    echo "元のエンコードされた文字列: " . $encodedStringUri . "\n";
28    echo "urldecode() でデコード:    " . urldecode($encodedStringUri) . "\n";
29    echo "rawurldecode() でデコード: " . rawurldecode($encodedStringUri) . "\n";
30    echo "コメント: RFC 3986 ではスペースは '%20' でエンコードされるため、\n";
31    echo "          両関数ともに '%20' をスペースに、'%2B' を '+' にデコードし、結果は同じになります。\n";
32}
33
34// サンプル関数の実行
35demonstrateUrlDecodeDifferences();
36
37?>

urldecode関数は、URLエンコードされた文字列をデコードし、元の文字列に戻すためのPHP関数です。引数にデコードしたい文字列を渡すと、デコードされた文字列が戻り値として返されます。

この関数とよく似たrawurldecode関数との最も重要な違いは、プラス記号(+)の扱いです。urldecode関数は、プラス記号を半角スペースに変換します。これは、Webフォームでデータを送信する際に使われるapplication/x-www-form-urlencodedという形式のルールに基づいています。

サンプルコードのケース1では、「Search+Query%2BPHP」という文字列をデコードしています。urldecode+をスペースに変換するため「Search Query+PHP」という結果になります。一方、rawurldecode+を変換せず、そのままプラス記号として扱うため「Search+Query+PHP」となります。なお、%2Bのようなパーセントエンコーディングされた文字は、どちらの関数も正しくプラス記号にデコードします。

このように、スペースのエンコード方法が異なるため、Webフォームのデータを扱う際にはurldecodeを、URIのパス部分などRFC 3986の仕様に沿ったデータを扱う際にはrawurldecodeを使い分けるのが一般的です。

urldecode関数は、プラス記号(+)を半角スペースに変換する特性があります。これは、主にHTMLフォームから送信されるデータ形式(application/x-www-form-urlencoded)をデコードするために設計されているためです。一方で、rawurldecode関数はプラス記号を変換せず、そのまま扱います。URLのパス部分など、一般的なURLエンコーディング(RFC 3986準拠)ではスペースは%20として表現されるため、こちらのデコードにはrawurldecodeが適しています。デコードしたい文字列の出自を意識し、フォームデータならurldecode、それ以外のURL要素ならrawurldecodeと使い分けることが、意図しないデータ変換を防ぎ、正しく処理を行う上で非常に重要です。

関連コンテンツ