@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不起作用.对于我的用例,我不认为我在乎那些,所以我不担心.但是,如果您的用例在这方面是不同的,那么您需要照顾.