2011-01-20 13 views
61

検索クエリを入力してフォームをsearch.php?query=your queryに送信した検索ページを作成しています。どのようなPHP関数が最高で、私は検索クエリをエンコード/デコードするために使うべきですか?PHPでURLを正しくエンコードするには?

+2

問題が発生しましたか?ブラウザーとPHPはこれを自動的に処理する必要があります(例えば、テキストフィールドに 'foo bar'を入れ、URLに' foo + bar'を作成します)。 –

+0

@Felix私は 'file_get_contents'を使ってサーチャースクリプトを呼び出すつもりです –

答えて

108

URIクエリでは、urlencode/urldecodeを使用します。それ以外の場合はrawurlencode/​​を使用してください。

urlencoderawurlencodeとの差が

  • rawurlencodeは(空間を用いて符号化された普通Percent-Encodingに従ってエンコードしながら

  • +0

    * application/x-www-form-urlencoded *は、 * Percent-Encoding *は、HTMLフォームデータのエンコードにのみ適用されます。 – Gumbo

    +0

    どのエンコーディングがより優れているか、form-urlencodedまたはpercentですか? –

    +1

    @ Click Upvote:そのように比較することはできません。 * application/x-www-form-urlencoded *形式は、スペースが '%20'ではなく' + 'でエンコードされていることを除いて* Percent-Encoding *形式です。それに加えて、* application/x-www-form-urlencoded *はフォームデータをエンコードするために使用され、* Percent-Encoding *はより一般的な使い方をしています。 – Gumbo

    14

    狡猾に名前が付けられたurlencode()およびurldecode()

    ただし、と$_GETに表示される変数にurldecode()を使用する必要はありません。

    +3

    狡猾に名前が付けられた' rawurlencode'と 'rawurldecode' ... –

    2

    これは私の使用例ですが、例外的な量のエンコーディングが必要です。たぶんあなたはそれが考案されたと思うかもしれませんが、私たちはこれを生産段階で実行します。偶然、これはすべてのタイプのエンコーディングをカバーするので、私はチュートリアルとして投稿しています。

    ユースケース記述

    誰かが私たちのウェブサイト上でのプリペイドギフトカード(「トークン」)を買いました。トークンには対応するURLがあります。この顧客は他の人に電子メールで連絡したいと考えています。私たちのウェブページには、それを可能にするmailtoリンクが含まれています。

    PHPコード

    // The order system generates some opaque token 
    $token = 'w%a&!e#"^2(^@azW'; 
    
    // Here is a URL to redeem that token 
    $redeemUrl = 'https://httpbin.org/get?token=' . urlencode($token); 
    
    // Actual contents we want for the email 
    $subject = 'I just bought this for you'; 
    $body = 'I just bought a widget for you. Please enter your shipping details here: ' . $redeemUrl; 
    
    // A URI for the email as prescribed 
    $mailToUri = 'mailto:?subject=' . rawurlencode($subject) . '&body=' . rawurlencode($body); 
    
    // Print an HTML element that links to that page 
    echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>'; 
    

    注:上記のあなたがtext/html文書に出力している前提としています。出力メディアのタイプがtext/jsonの場合は、出力のエンコーディングがjson_encode()で処理されるため、単に$retval['url'] = $mailToUri;を使用してください。

    テストケース

    1. PHPテストサイト上のコードを実行します(は、私がここで言及すべき標準的なものがある?
    2. を送る電子メールをリンク
    3. をクリック
    4. メールを受け取る
    5. このリンクをクリックしてください

    あなたは表示されるはずです。

    "args": { 
        "token": "w%a&!e#\"^2(^@azW" 
    }, 
    

    そして、もちろん、これは上記$tokenのJSON表現です。