PHP: rawurldecode() 不显示加号

PHP: rawurldecode() not showing plus sign

我有一个 URL 这样的:

abc.com/my+string

当我得到参数时,它显然用 space 替换了 +,所以我得到 my string

我把url中的+换成%2B,然后用rawurldecode(),结果还是一样。尝试使用 urldecode() 但我仍然无法在变量中获取 plus sign,它始终为空 space。

我是不是遗漏了什么,如何从 url abc.com/my%2Bstring 中准确地得到 PHP 中的 my+string

谢谢

像这样:

echo urldecode("abc.com/my%2Bstring");      // => abc.com/my+string
echo PHP_EOL;
echo rawurldecode("abc.com/my%2Bstring");   // => abc.com/my+string

此外,如果您想获得实际的 my+string,您可以利用 PHP 本身附带的 parse_url 函数的强大功能,尽管您必须提供完整的 URL进入其中。

其他方法只是通过 / explode 值并像这样获取它:

$parts = explode('/', 'abc.com/my+string'); // => Array(2)
echo $parts[1] ?? 'not found';              // => string|not found

另请阅读有关两者的文档:urldecode and rawurldecode

Example here.

一般来说,您不需要 URL 手动解码 GET 参数值,因为 PHP 已经为您自动完成了。 abc.com?var=my%2Bstring -> $_GET['var'] 将包含 my+string

这里的问题是 URL 重写在起作用。正如 http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_b 解释的那样,

mod_rewrite has to unescape URLs before mapping them, so backreferences will be unescaped at the time they are applied.

因此 mod_rewrite 已将 my%2Bstring 解码为 my+string,当您将其重写为查询字符串参数时,您实际上得到了 ?var=my+string。当 PHP 对 那个 值应用自动 URL 解码时,+ 将变成一个简单的 space.

[B] 标志的存在使 mod_rewrite 再次对值进行重新编码。