【问题标题】:Is it possible to preserve plus signs in PHP $_GET vars without encoding?是否可以在不编码的情况下保留 PHP $_GET vars 中的加号?
【发布时间】:2012-08-16 00:53:41
【问题描述】:

假设我请求这个 URL:

http://mydomain.com/script.php?var=2+2

$_GET['var'] 现在将是:“2 2”,应该是“2+2”

显然我可以在发送之前对数据进行编码然后对其进行解码,但我想知道这是否是唯一的解决方案。我也可以用加号替换空格,但我也想允许空格。我只是想要传递任何字符,而不需要进行任何 url 解码或编码。谢谢!

【问题讨论】:

  • 你可以抓住$_SERVER["QUERY_STRING"] - 我认为这会给你原始文本?
  • 为什么不进行 url 编码?方法是 url 编码,所以它看起来像 var=2%202 (其中 20 是一个数字,它将是表示符号 + 的实数)。并且php内置了解码功能!
  • 我不想编码的原因是,我想要更漂亮的 URL。在我的网站上,URL 位于 URL 中。例如mydomain.com/url?url=http://google.com 看起来比 mydomain.com/url?url=http%3a%2f%2fgoogle.com%2f 好(我试过 mydomain.com/url/http://google.com 但我可以让它工作 - 它破坏了 mod_rewrite 并由于某种原因导致错误)

标签: php encoding get


【解决方案1】:
if(strpos($_SERVER["QUERY_STRING"], "+") !== false){
    $_SERVER["QUERY_STRING"] = str_replace("+", "%2B", $_SERVER["QUERY_STRING"]);
    parse_str($_SERVER["QUERY_STRING"], $_GET);
}

【讨论】:

    【解决方案2】:

    当然。你可以读出$_SERVER["QUERY_STRING"],自己分解,然后放弃通常的URL解码,或者只转换%xx占位符。

    preg_match_all('/(\w+)=([^&]+)/', $_SERVER["QUERY_STRING"], $pairs);
    $_GET = array_combine($pairs[1], $pairs[2]);
    

    (示例仅适用于字母数字参数,不进行上述 %xx 解码。只是分解原始输入。)

    【讨论】:

    • 没有标志来防止对参数值进行 urldecoding。
    • 我需要的数据其实在$_SERVER["QUERY_STRING"]中,但是解析它是个问题。 @webarto parse_str() 将加号转换为空格
    • 我找到了一个使用 preg_match 和 $_SERVER["QUERY_STRING"] 的黑客解决方案 - 谢谢
    • 此正则表达式不适用于foo-variable=foo-value&moo-variable=moo-value 之类的查询字符串,因为\w 不包括-
    【解决方案3】:

    您可以使用urlencode,尽管这也会将任何空格转换为加号。这是有道理的,因为 URL 中的 + 通常代表一个空格。如果您确实需要一个加号来表示加号,您可能应该转义输入。这意味着 + 将变为 %2B 而您的 URL 将是 http://mydomain.com/script.php?var=2%2B2

    【讨论】:

    • 这就是我对它进行编码的意思——我试图找到一个比所有那些 % 磅符号更漂亮的解决方案,因此链接在传递时看起来更好。
    【解决方案4】:

    在查询段中生成包含+ 的 URL 的人是错误的,除非他们打算用它来表示空格字符。查询中的+ 是保留字符(回复:RFC2396 §3.4)。如果需要在查询字符串中插入文字+,则必须将其编码为%2B(回复:RFC2396 §2.2)。

    【讨论】:

      【解决方案5】:

      为了将来参考,您可以在获取请求中显示“+”符号,而无需提交带有编码符号的 url。

      PHP Version 5.3.8
      

      提交http://mydomain.com/script.php?var=2+2

      回声:

      2+2
      

      使用以下代码:

      <?php
      echo urlencode($_GET['var']);
      ?>
      

      【讨论】:

      • 这实际上是错误的,因为发送2%202 会得到相同的结果而不是2 2
      【解决方案6】:

      需要几个步骤。

      • 只需将您的查询参数加号 (+) 替换为 url 中的 '%2B' 在请求网址之前。

      • 现在您将只检索查询参数。它会 自动将“%2B”替换为加号。

      【讨论】:

        【解决方案7】:

        我刚刚使用 urlencode() 对 URL 进行编码,然后使用 urldecode($_Get()) 使字符串再次可用。

        【讨论】:

          猜你喜欢
          • 2021-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          • 1970-01-01
          • 2020-06-01
          • 2019-02-12
          相关资源
          最近更新 更多