如何在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)"