Wie kann ich eine Zeichenfolge in PHP richtig URL-codieren?

Lesezeit: 6 Minuten

Alis Benutzeravatar
Ali

Ich erstelle eine Suchseite, auf der Sie eine Suchanfrage eingeben und an das Formular gesendet wird search.php?query=your query. Welche PHP-Funktion ist die beste und die sollte ich zum Codieren/Decodieren der Suchanfrage verwenden?

  • Haben Sie irgendwelche Probleme? Browser und PHP sollten dies bereits automatisch handhaben (zB Putting foo bar in einem Textfeld erstellt foo+bar in der URL).

    – Felix Klinge

    20. Januar 2011 um 8:33 Uhr


  • @Felix Ich werde das Suchskript mit aufrufen file_get_contents

    – Ali

    20. Januar 2011 um 8:36 Uhr

Gumbos Benutzeravatar
Gumbo

Verwenden Sie für die URI-Abfrage urlencode/urldecode; für irgendetwas anderes verwenden rawurlencode/rawurldecode.

Der Unterschied zwischen urlencode und rawurlencode ist das

  • application/x-www-form-urlencoded ist nur eine spezielle Variante der Prozentkodierung und wird nur zum Codieren von HTML-Formulardaten angewendet.

    – Gumbo

    20. Januar 2011 um 8:44 Uhr

  • @Click Upvote: Sie können auf diese Weise nicht verglichen werden. Die application/x-www-form-urlencoded Format ist der Prozentkodierung Format, außer dass das Leerzeichen mit codiert ist + anstatt %20. Und davon abgesehen, application/x-www-form-urlencoded wird verwendet, um Formulardaten zu codieren, während die Prozentkodierung hat eine allgemeinere Verwendung.

    – Gumbo

    20. Januar 2011 um 10:25 Uhr

  • rawurlencode() ist mit Javascript kompatibel decodeURI() Funktion

    – Clive Paterson

    3. März 2015 um 6:40 Uhr

  • Ist diese Regel immer die empirische? Ich meine, wenn ich eine Abfragezeichenfolge codieren muss, verwende ich immer urldecode. Was ist dann mit dem URI-Pfad (zB /a/path with spaces/) und URI-Fragment (zB #fragment). Soll ich immer verwenden rawurldecode für diese beiden?

    – Tonix

    12. September 2018 um 16:53 Uhr

  • Eine gute Faustregel ist, dass für Pfade (wie /my%20folder/) mit gehen rawurlencode; aber für POST- und GET-Felder gehen Sie mit urlencode (Wie /?folder=my+folder)`

    – Soroush Falahati

    29. Januar 2019 um 15:45 Uhr


Der schlaue Name URL-Code () und urldecode().

Sie sollten jedoch nicht verwenden müssen urldecode() auf Variablen, die in erscheinen $_POST und $_GET.

  • könnten Sie bitte erläutern, warum urldecode() nicht mit $_POST verwendet werden sollte. weil ich das seit ewigkeiten ohne probleme mache.

    – sid

    21. Mai 2019 um 13:18 Uhr

  • Muss ich grundlegende Parameter codieren (zB "name=b&age=c&location=d") per AJAX an eine PHP-Datei gesendet?

    – alter Junge

    29. Juli 2019 um 1:07 Uhr

  • Betreff “solltest du nicht müssen”: Warum nicht? Weil sie bereits codiert sind?

    – Peter Mortensen

    13. Dezember 2022 um 21:40 Uhr

Benutzeravatar von William Entriken
Wilhelm Entriken

Hier ist mein Anwendungsfall, der eine außergewöhnliche Menge an Codierung erfordert. Vielleicht denkst du, es ist gekünstelt, aber wir führen das in der Produktion. Zufälligerweise deckt dies jede Art von Codierung ab, daher poste ich es als Tutorial.

Beschreibung des Anwendungsfalls

Jemand hat gerade eine Prepaid-Geschenkkarte (“Token”) auf unserer Website gekauft. Token haben entsprechende URLs, um sie einzulösen. Dieser Kunde möchte die URL per E-Mail an jemand anderen senden. Unsere Webseite enthält a mailto Link, mit dem sie das tun können.

PHP-Code

// 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 = '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 with that mailto link
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>';

Hinweis: Das Obige setzt voraus, dass Sie an a ausgeben text/html dokumentieren. Wenn Ihr Ausgabemedientyp ist text/json dann einfach verwenden $retval['url'] = $mailToUri; weil die Ausgabecodierung von gehandhabt wird json_encode().

Testfall

  1. Führen Sie den Code auf einer PHP-Testseite aus (Gibt es eine kanonische, die ich hier erwähnen sollte?)
  2. Klicken Sie auf den Link
  3. Senden Sie die E-Mail
  4. Holen Sie sich die E-Mail
  5. Klicken Sie auf diesen Link

Das solltest du sehen:

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

Und das ist natürlich die JSON-Darstellung von $token Oben.

  • Äquivalent und weniger semantisch (weil mailto: ist kein HTTP), können Sie verwenden $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);.

    – Wilhelm Entriken

    21. August 2019 um 13:34 Uhr

Benutzeravatar von Amranur Rahman
Amranur Rahman

Sie können URL-Codierungsfunktionen verwenden. PHP hat die

rawurlencode()

Funktion.

ASP.NET hat die

Server.URLEncode()

Funktion.

In JavaScript können Sie die verwenden

encodeURIComponent()

Funktion.

Basierend auf der Art der RFC-Standardcodierung, die Sie ausführen möchten, oder wenn Sie Ihre Codierung anpassen müssen, möchten Sie möglicherweise Ihre eigene Klasse erstellen.

/**
 * UrlEncoder make it easy to encode your URL
 */
class UrlEncoder{
    public const STANDARD_RFC1738 = 1;
    public const STANDARD_RFC3986 = 2;
    public const STANDARD_CUSTOM_RFC3986_ISH = 3;
    // add more here

    static function encode($string, $rfc){
        switch ($rfc) {
            case self::STANDARD_RFC1738:
                return  urlencode($string);
                break;
            case self::STANDARD_RFC3986:
                return rawurlencode($string);
                break;
            case self::STANDARD_CUSTOM_RFC3986_ISH:
                // Add your custom encoding
                $entities = ['%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'];
                $replacements = ['!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"];
                return str_replace($entities, $replacements, urlencode($string));
                break;
            default:
                throw new Exception("Invalid RFC encoder - See class const for reference");
                break;
        }
    }
}

Anwendungsbeispiel:

$dataString = "https://www.google.pl/search?q=PHP is **great**!&id=123&css=#kolo&[email protected])";

$dataStringUrlEncodedRFC1738 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC1738);
$dataStringUrlEncodedRFC3986 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC3986);
$dataStringUrlEncodedCutom = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_CUSTOM_RFC3986_ISH);

Wird ausgegeben:

string(126) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP+is+%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(130) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP%20is%20%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(86)  "https://www.google.pl/search?q=PHP+is+**great**!&id=123&css=#kolo&[email protected])"

* Erfahren Sie mehr über RFC-Standards:
https://datatracker.ietf.org/doc/rfc3986/
und urlencode vs rawurlencode?

Benutzeravatar von Peter Mortensen
Peter Mortensen

Sie wissen, wie Leute immer wieder Dinge sagen wie: „Erstellen Sie niemals manuell einen JSON-String in PHP – rufen Sie immer an json_encode() für Stabilität/Zuverlässigkeit.”?

Nun, wenn Sie eine Abfragezeichenfolge erstellen, dann sage ich: „Erstellen Sie niemals manuell eine URL-Abfragezeichenfolge in PHP – rufen Sie immer auf http_build_query() für Stabilität/Zuverlässigkeit.”

Demo:

$array = [
    'query' => 'your query',
    'example' => null,
    'Qbert says:' => '&%=#?/'
];

echo http_build_query($array);

echo "\n---\n";

echo http_build_query($array, '', '&amp;');

Ausgabe:

query=your+query&Qbert+says%3A=%26%25%3D%23%3F%2F
---
query=your+query&amp;Qbert+says%3A=%26%25%3D%23%3F%2F

Das Kleingedruckte dieser Funktion ist, dass, wenn ein Element im Eingabearray ein hat null Wert, dann wird dieses Element nicht in die Ausgabezeichenfolge aufgenommen.

Hier ist eine pädagogische Antwort auf die Joomla Stack Exchange-Site was zur Verwendung anregt &amp; als benutzerdefiniertes Trennzeichen: Warum werden Joomla-URL-Abfragezeichenfolgen normalerweise mit “&” anstelle von “&” getrennt?

Das anfängliche Verpacken Ihrer Abfragezeichenfolgendaten in Arrayform bietet eine kompakte und lesbare Struktur, dann der Aufruf von http_build_query() erledigt die harte Arbeit und kann Datenbeschädigungen verhindern. Ich entscheide mich im Allgemeinen für diese Technik, sogar für kleine Abfragezeichenfolgen.

1441070cookie-checkWie kann ich eine Zeichenfolge in PHP richtig URL-codieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy