Estou fazendo uma página de pesquisa, onde você digita uma consulta de pesquisa e o formulário é enviado search.php?query=your query
. Qual função PHP é a melhor e que devo usar para codificar / decodificar a consulta de pesquisa?
file_get_contents
Estou fazendo uma página de pesquisa, onde você digita uma consulta de pesquisa e o formulário é enviado search.php?query=your query
. Qual função PHP é a melhor e que devo usar para codificar / decodificar a consulta de pesquisa?
file_get_contents
Respostas:
Para a consulta de URI, use urlencode
/ urldecode
; para qualquer outra coisa, use rawurlencode
/ rawurldecode
.
A diferença entre urlencode
e rawurlencode
é que
urlencode
codifica de acordo com application / x-www-form-urlencoded (o espaço é codificado com +
) enquantorawurlencode
codifica de acordo com o Percent-Encoding simples (o espaço é codificado com %20
).+
vez de %20
. Além disso, application / x-www-form-urlencoded é usado para codificar os dados do formulário, enquanto o Percent-Encoding tem um uso mais geral.
urldecode
. Então, que tal o caminho URI (por exemplo /a/path with spaces/
) e o fragmento de URI (por exemplo #fragment
). Devo sempre usar rawurldecode
para esses dois?
rawurlencode
; mas para os campos POST e GET vá com urlencode
(Like /? pasta = minha + pasta) `
O urlencode () e o urldecode () com nomes astutos .
No entanto, você não deve precisar usar urldecode()
em variáveis que aparecem em $_POST
e $_GET
.
"name=b&age=c&location=d"
) enviados para um arquivo PHP via AJAX?
Aqui está meu caso de uso, que requer uma quantidade excepcional de codificação. Talvez você pense que foi artificial, mas executamos isso na produção. Coincidentemente, isso cobre todo tipo de codificação, então estou postando como um tutorial.
Alguém acabou de comprar um cartão-presente pré-pago ("token") em nosso site. Os tokens têm URLs correspondentes para resgatá-los. Este cliente deseja enviar o URL por e-mail para outra pessoa. Nossa página da web inclui um mailto
link que permite que eles façam isso.
// 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>';
Nota: o acima pressupõe que você está enviando para um text/html
documento. Se o seu tipo de mídia de saída for text/json
simplesmente usado $retval['url'] = $mailToUri;
porque a codificação de saída é controlada por json_encode()
.
Você deveria ver:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
E, claro, esta é a representação JSON $token
acima.
mailto:
não é HTTP), você pode usar $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.
Você pode usar funções de codificação de URL. PHP tem o
rawurlencode()
função
ASP tem o
Server.URLEncode()
função
Em JavaScript, você pode usar o
encodeURIComponent()
função.
Com base no tipo de codificação padrão RFC que você deseja executar ou se precisar personalizar sua codificação, você pode criar sua própria classe.
/**
* 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;
}
}
}
Use o exemplo:
$dataString = "https://www.google.pl/search?q=PHP is **great**!&id=123&css=#kolo&email=me@liszka.com)";
$dataStringUrlEncodedRFC1738 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC1738);
$dataStringUrlEncodedRFC3986 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC3986);
$dataStringUrlEncodedCutom = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_CUSTOM_RFC3986_ISH);
Irá produzir:
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=me@liszka.com)"
* Saiba mais sobre os padrões RFC: https://datatracker.ietf.org/doc/rfc3986/ e urlencode vs rawurlencode?
foo bar
um campo de texto, criarfoo+bar
na URL).