我需要使用PHP仅对URL的目录路径和文件名进行URL编码。

所以我想编码类似http://example.com/file name的东西,并使其产生http://example.com/file%20name

当然,如果我执行urlencode('http://example.com/file name');,那么我最终会得到http%3A%2F%2Fexample.com%2Ffile+name

最明显的解决方案(无论如何对我而言)是使用parse_url()将URL拆分为方案,主机等,然后仅urlencode()将需要它的部分(如路径)。然后,我将使用http_build_url()重组URL。

有没有比这更优雅的解决方案了?还是这基本上是要走的路?

最佳答案

@deceze绝对让我走了正确的路,所以请投票支持他的答案。但是,这确实是有效的:

    $encoded_url = preg_replace_callback('#://([^/]+)/([^?]+)#', function ($match) {
                return '://' . $match[1] . '/' . join('/', array_map('rawurlencode', explode('/', $match[2])));
            }, $unencoded_url);

有几件事要注意:
  • http_build_url需要安装PECL,因此,如果您将代码分发给其他人(如本例所示),您可能希望避免使用它,并像我在这里那样坚持进行reg exp解析(再次从@dezeze的答案中窃取信息,再次,去投票那件事)。
  • urlencode()不是要走的路!您需要使用rawurlencode()作为路径,以便将空格编码为%20而不是+。对于查询字符串,将空格编码为+很好,但对于路径则不是那么热。
  • 这不适用于需要用户名/密码编码的URL。对于我的用例,我认为我并不在乎这些,因此我并不担心。但是,如果您的用例在这方面有所不同,则需要注意这一点。
  • 09-09 23:18
    查看更多