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?
Wie kann ich eine Zeichenfolge in PHP richtig URL-codieren?
Ali
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
urlencode
kodiert gem application/x-www-form-urlencoded (Leerzeichen sind kodiert mit+
) währendrawurlencode
kodiert nach der Ebene Prozentkodierung (Leerzeichen sind kodiert mit%20
).
-
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 verwendenrawurldecode
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 miturlencode
(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
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
- Führen Sie den Code auf einer PHP-Testseite aus (Gibt es eine kanonische, die ich hier erwähnen sollte?)
- Klicken Sie auf den Link
- Senden Sie die E-Mail
- Holen Sie sich die E-Mail
- 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
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?
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, '', '&');
Ausgabe:
query=your+query&Qbert+says%3A=%26%25%3D%23%3F%2F
---
query=your+query&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 &
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.
Haben Sie irgendwelche Probleme? Browser und PHP sollten dies bereits automatisch handhaben (zB Putting
foo bar
in einem Textfeld erstelltfoo+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