如何使用php将相对路径转换为绝对URL?
发布于 2010-12-15 05:36:54
function rel2abs($rel, $base)
{
    /* return if already absolute URL */
    if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
    /* queries and anchors */
    if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
    /* parse base URL and convert to local variables:
       $scheme, $host, $path */
    extract(parse_url($base));
    /* remove non-directory element from path */
    $path = preg_replace('#/[^/]*$#', '', $path);
    /* destroy path if relative url points to root */
    if ($rel[0] == '/') $path = '';
    /* dirty absolute URL */
    $abs = "$host$path/$rel";
    /* replace '//' or '/./' or '/foo/../' with '/' */
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
    /* absolute URL is ready! */
    return $scheme.'://'.$abs;
}发布于 2014-09-11 11:12:04
我喜欢jordanstephens从链接中提供的代码!我投了赞成票。l0oky给了我灵感,让我确保这个函数是端口、用户名和密码兼容的。我的项目需要它。
function rel2abs( $rel, $base )
{
    /* return if already absolute URL */
    if( parse_url($rel, PHP_URL_SCHEME) != '' )
        return( $rel );
    /* queries and anchors */
    if( $rel[0]=='#' || $rel[0]=='?' )
        return( $base.$rel );
    /* parse base URL and convert to local variables:
       $scheme, $host, $path */
    extract( parse_url($base) );
    /* remove non-directory element from path */
    $path = preg_replace( '#/[^/]*$#', '', $path );
    /* destroy path if relative url points to root */
    if( $rel[0] == '/' )
        $path = '';
    /* dirty absolute URL */
    $abs = '';
    /* do we have a user in our URL? */
    if( isset($user) )
    {
        $abs.= $user;
        /* password too? */
        if( isset($pass) )
            $abs.= ':'.$pass;
        $abs.= '@';
    }
    $abs.= $host;
    /* did somebody sneak in a port? */
    if( isset($port) )
        $abs.= ':'.$port;
    $abs.=$path.'/'.$rel;
    /* replace '//' or '/./' or '/foo/../' with '/' */
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for( $n=1; $n>0; $abs=preg_replace( $re, '/', $abs, -1, $n ) ) {}
    /* absolute URL is ready! */
    return( $scheme.'://'.$abs );
}发布于 2015-03-24 01:01:28
添加了保留当前查询的支持。对?page=1等帮助很大。
function rel2abs($rel, $base)
{
    /* return if already absolute URL */
    if (parse_url($rel, PHP_URL_SCHEME) != '')
        return ($rel);
    /* queries and anchors */
    if ($rel[0] == '#' || $rel[0] == '?')
        return ($base . $rel);
    /* parse base URL and convert to local variables: $scheme, $host, $path, $query, $port, $user, $pass */
    extract(parse_url($base));
    /* remove non-directory element from path */
    $path = preg_replace('#/[^/]*$#', '', $path);
    /* destroy path if relative url points to root */
    if ($rel[0] == '/')
        $path = '';
    /* dirty absolute URL */
    $abs = '';
    /* do we have a user in our URL? */
    if (isset($user)) {
        $abs .= $user;
        /* password too? */
        if (isset($pass))
            $abs .= ':' . $pass;
        $abs .= '@';
    }
    $abs .= $host;
    /* did somebody sneak in a port? */
    if (isset($port))
        $abs .= ':' . $port;
    $abs .= $path . '/' . $rel . (isset($query) ? '?' . $query : '');
    /* replace '//' or '/./' or '/foo/../' with '/' */
    $re = ['#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'];
    for ($n = 1; $n > 0; $abs = preg_replace($re, '/', $abs, -1, $n)) {
    }
    /* absolute URL is ready! */
    return ($scheme . '://' . $abs);
}https://stackoverflow.com/questions/4444475
复制相似问题