实现PHP中parse_url的逆运算http_build_url

PHP中有一个解析URL的内置函数parse_url,用来把一个URL中的各部分拆解开来。但是诡异的是这个内置函数没有提供逆运算,有一个可以做逆运算的 http_build_url ,但是要装一个http的pecl包。

其实这个算法不难,自己写一个,做好验证和健壮性即可。

/**
 * 创建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;
}

函数的入参可以直接是parse_url的输出。并且额外支持了两个选项,path_prefix和path_surfix。主要应用在我们的一些图片地址业务上,比如加/upload前缀加!small的缩略图后缀等。

发表评论