我需要使用
PHP对URL的目录路径和文件名进行URL编码.
所以我想编写一个像http://example.com/file name这样的东西,并且它的结果是http://example.com/file的名字.
当然,如果我做urlencode(‘http://example.com/file name’);那么我最后使用http://example.com/file名称.
明显的(对我来说,反正)解决方案是使用parse_url()将URL分解为scheme,host等,然后只是urlencode()需要它的部分像路径.然后,我将使用http_build_url()重新组合URL.
有比这更优雅的解决方案吗?还是基本上要走的路?
@deceze肯定让我走正确的道路,所以去upvote他的答案.但这是正是有用的:
$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解析,就像我在这里(从@ deceze的答案中大量窃取 – 去upvote那件事).> urlencode()不行!您需要使用rawurlencode()作为路径,以便空格得到编码.将空格编码为查询字符串,但对路径不太热.>这对于需要用户名/密码编码的URL不起作用.对于我的用例,我不认为我在乎那些,所以我不担心.但是,如果您的用例在这方面是不同的,那么您需要照顾.