Wie kann man eine Zeichenfolge in PHP per URL codieren?

96

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

Klicken Sie auf Upvote
quelle
2
Haben Sie Probleme? Browser und PHP sollten dies bereits automatisch erledigen (z. B. foo barein Textfeld einfügen, foo+barin der URL erstellen).
Felix Kling
@ Felix Ich werde das Sucherskript mitfile_get_contents
Click Upvote

Antworten:

183

Verwenden Sie für die URI-Abfrage urlencode/ urldecode; für alles andere benutze rawurlencode/ rawurldecode.

Der Unterschied zwischen urlencodeund rawurlencodeist das

Gumbo
quelle
application / x-www-form-urlencoded ist nur eine spezielle Variante des Percent-Encoding und wird nur zu kodieren HTML - Formulardaten angewandt.
Gumbo
1
@Click Upvote: Sie können auf diese Weise nicht verglichen werden. Das Format application / x-www-form-urlencoded ist das Percent-Encoding- Format, mit der Ausnahme, dass der Speicherplatz +anstelle von codiert wird %20. Und außerdem, application / x-www-form-urlencoded zu codieren Formulardaten verwendet wird , während das Percent-Encoding eine allgemeinere Verwendung hat.
Gumbo
11
rawurlencode () ist kompatibel mit der Javascript decodeURI () Funktion
Clive Paterson
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 (z. B. /a/path with spaces/) und dem URI-Fragment (z #fragment. B. )? Sollte ich immer rawurldecodefür diese beiden verwenden?
Tonix
Eine gute Faustregel , dass für Pfade (Like / my% 20folder /) geht mit rawurlencode; aber für POST- und GET-Felder gehen Sie mit urlencode(Like /?
folder
22

Der listige Name urlencode () und urldecode () .

Sie sollten jedoch keine urldecode()Variablen verwenden müssen, die in $_POSTund angezeigt werden $_GET.

Oliver Charlesworth
quelle
4
Könnten Sie bitte erläutern, warum urldecode () nicht mit $ _POST verwendet werden sollte? weil ich das seit Ewigkeiten ohne Probleme mache.
Sid
Muss ich grundlegende Parameter (z. B. "name=b&age=c&location=d") codieren, die über AJAX an eine PHP-Datei gesendet wurden?
Oldboy
9

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

Anwendungsfallbeschreibung

Jemand hat gerade eine Prepaid-Geschenkkarte ("Token") auf unserer Website gekauft. Tokens haben entsprechende URLs, um sie einzulösen. Dieser Kunde möchte die URL per E-Mail an eine andere Person senden. Unsere Webseite enthält einen mailtoLink, über den sie dies 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: Bei den obigen Angaben wird davon ausgegangen, dass Sie in ein text/htmlDokument ausgeben . Wenn Ihr Ausgabemedientyp verwendet wird, verwenden Sie text/jsoneinfach, $retval['url'] = $mailToUri;da die Ausgabecodierung von verwaltet 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 natürlich ist dies die JSON-Darstellung von $tokenoben.

William Entriken
quelle
Entsprechend und weniger semantisch (da mailto:es sich nicht um HTTP handelt) können Sie verwenden $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);.
William Entriken
0

Sie können URL-Codierungsfunktionen verwenden, über die PHP verfügt

rawurlencode() 

Funktion

ASP hat die

Server.URLEncode() 

Funktion

In JavaScript können Sie die verwenden

encodeURIComponent() 

Funktion.

Amranur Rahman
quelle