PHP中有一个解析URL的内置函数parse_url,用来把一个URL中的各部分拆解开来。但是这个内置函数并没有提供逆运算,有一个可以做逆运算的 http_build_url ,但是要装一个http的pecl包。
其实这个方法不难,自己写一个,做好验证和健壮性即可。
逆运算的应用场景是什么呢。比如你要给某个URL更换域名,虽然查找替换也可以,但是整体的查找替换不好控制范围,因为可能会命中path或者query string中的部分。如果用parse_url拆解之后再做处理就精准的多。
函数的入参可以直接是parse_url的输出。并且额外支持了两个选项,path_prefix和path_surfix。主要应用在我们的一些图片地址业务上,比如加/upload前缀加!small的缩略图后缀等。大家可以根据自己的需求使用或修改。
/**
* 创建url的方法,parse_url的逆运算
*
* 支持输出 http://hostname.com:8080/prefix/path!surfix?query_string#fragment
* //hostname.com/prefix/path!surfix
* /prefix/path!surfix
* /path#fregment
* ...
*
* @param mixed $urlPart parse_url的输出数据
* 扩展支持两个字段
* path_prefix 路径加前缀
* path_surfix 路径加后缀
* @return string URL
*/
function http_build_url($urlPart){
$url = '';
if ( !empty($urlPart['host']) ){
if ( !empty($urlPart['scheme']) ){
$url.=$urlPart['scheme'].':';
}
$url.='//'.trim($urlPart['host'], '/');
if ( !empty($urlPart['port']) ) {
$url.=':'.$urlPart['port'];
}
}
if ( !empty($urlPart['path_prefix']) ) {
$url .= '/'.trim($urlPart['path_prefix'], '/');
}
$url.='/'.ltrim($urlPart['path'], '/');
if ( !empty($urlPart['path_surfix']) ) {
$url .= $urlPart['path_surfix'];
}
if ( !empty($urlPart['query']) ){
$url.='?'.$urlPart['query'];
}
if ( !empty($urlPart['fragment']) ){
$url.='#'.$urlPart['fragment'];
}
return $url;
}