如何在PHP中正确地对字符串进行URL编码?
我正在创建一个搜索页面,您在其中键入一个搜索查询,然后将表单提交到如何在PHP中正确地对字符串进行URL编码?,php,urlencode,Php,Urlencode,我正在创建一个搜索页面,您在其中键入一个搜索查询,然后将表单提交到search.php?query=your query。什么PHP函数是最好的,我应该使用它来编码/解码搜索查询?巧妙地命名和 但是,对于URI查询使用,不需要对出现在$\u POST和$\u GET中的变量使用urldecode();对于其他任何内容,请使用/ urlencode和rawurlencode之间的区别在于 urlencode根据(空格用+编码)编码,而 rawurlencode根据平原编码(空格用%20编码) 这
search.php?query=your query
。什么PHP函数是最好的,我应该使用它来编码/解码搜索查询?巧妙地命名和
但是,对于URI查询使用,不需要对出现在$\u POST
和$\u GET
中的变量使用urldecode();对于其他任何内容,请使用/
urlencode
和rawurlencode
之间的区别在于
urlencode
根据(空格用+
编码)编码,而
rawurlencode
根据平原编码(空格用%20
编码)
这是我的用例,它需要大量的编码。也许你认为这是人为的,但我们是在生产中运行的。巧合的是,这涵盖了所有类型的编码,所以我将作为教程发布
用例描述
有人刚在我们的网站上买了一张预付礼品卡(“代币”)。令牌具有相应的URL来兑换它们。此客户希望通过电子邮件将URL发送给其他人。我们的网页包含一个
mailto
链接,让他们可以这样做
PHP代码
当然,这是上面$token
的JSON表示。您可以使用PHP提供的URL编码函数
rawurlencode()
作用
ASP具有
Server.URLEncode()
作用
在JavaScript中,您可以使用
encodeURIComponent()
函数。根据要执行的RFC标准编码类型,或者如果需要自定义编码,则可能需要创建自己的类
/**
* 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;
}
}
}
使用示例:
$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);
将输出:
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)"
*了解有关RFC标准的更多信息:
而且您是否遇到任何问题?浏览器和PHP应该已经自动处理了(例如,将foo-bar
放在文本字段中,在URL中创建foo+bar
)@Felix我将使用file\u get\u contents
application/x-www-form-urlencoded调用searcher脚本,它只是百分比编码的一个特殊变体,仅用于对HTML表单数据进行编码。@Click Upvote:它们不能以这种方式进行比较。application/x-www-form-urlencoded格式是百分比编码格式,但空格是用+
而不是%20
编码的。除此之外,application/x-www-form-urlencoded用于对表单数据进行编码,而百分比编码具有更广泛的用途。rawurlencode()与javascript decodeURI()函数兼容。此规则是否始终是经验规则?我的意思是,当我需要对查询字符串进行编码时,我总是使用urldecode
。那么,URI路径(例如带空格的路径)和URI片段(例如片段)呢。我是否应该始终使用rawurldecode
来处理这两个问题?一个很好的经验法则是,对于路径(如/my%20folder/),使用rawurldecode
;但是对于POST和GET字段,请使用urlencode
(比如/?folder=my+folder)`请详细说明为什么urldecode()不应与$\u POST一起使用。因为我这么做已经很久了,没有任何问题。我需要通过AJAX将基本参数(例如,“name=b&age=c&location=d”
)编码到PHP文件中吗?等价地,语义更少(因为mailto:
不是HTTP),可以使用$mailToUri'mailto:。http_build_query(['subject'=>$subject,'body'=>$body],null,&',PHP_query_RFC3986)代码>。
$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);
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)"