实现PHP中parse_url的逆运算http_build_url

284 阅读1分钟

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;
}