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的缩略图后缀等。