PHP:实际URL的系统路径

时间:2014-09-27 20:54:44

标签: php

在我提出问题之前,我想说我已经尝试过从stackoverflow找到的所有相关帖子,例如PHP - Convert File system path to URL,并且没有任何对我有用,这意味着我没有得到我正在寻找的Url。

我需要一个

function PathToUrl($path) 
{
 ... 
}  

返回$path

的实际网址

使用示例: echo PathToUrl('../songs');应输出http://www.mywebsite.com/files/morefiles/songs

注意:我在stackoverflow上找到的函数的问题是它们不适用于包含../的路径,例如在echo PathToUrl('../songs');上我会得到类似{ {1}}这不是我想要的。

2 个答案:

答案 0 :(得分:2)

在这里,我做了这个功能,它完美无缺:

function getPath($path)
{
    $url = "http".(!empty($_SERVER['HTTPS'])?"s":"").
        "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    $dirs = explode('/', trim(preg_replace('/\/+/', '/', $path), '/'));
    foreach ($dirs as $key => $value)
        if (empty($value))  unset($dirs[$key]);
    $parsedUrl = parse_url($url);
    $pathUrl = explode('/', trim($parsedUrl['path'], '/'));
    foreach ($pathUrl as $key => $value)
        if (empty($value))  unset($pathUrl[$key]);
    $count = count($pathUrl);
    foreach ($dirs as $key => $dir)
        if ($dir === '..')
            if ($count > 0)
                array_pop($pathUrl);
            else
                throw new Exception('Wrong Path');
        else if ($dir !== '.')
            if (preg_match('/^(\w|\d|\.| |_|-)+$/', $dir)) {
                $pathUrl[] = $dir;
                ++$count;
            }
            else
                throw new Exception('Not Allowed Char');
    return $parsedUrl['scheme'].'://'.$parsedUrl['host'].'/'.implode('/', $pathUrl);
}

示例

假设您当前的位置为http://www.mywebsite.com/files/morefiles/movies


echo getPath('../songs');

<强>输出

http://www.mywebsite.com/files/morefiles/songs

echo getPath('./songs/whatever');

<强>输出

http://www.mywebsite.com/files/morefiles/movies/songs/whatever

echo getPath('../../../../../../');

在这种情况下,它会抛出 exception


注意

我使用此正则表达式'/^(\w|\d|\.| |_|-)+$/'来检查路径目录,这意味着只允许使用数字,字符,'。',' - ','_'和''。将为其他角色播放一个例外。

此功能将更正路径.///path

<强>有用

答案 1 :(得分:1)

我看到答案已经发布,但是我会发布我的解决方案,允许直接指定URL:

echo up('http://www.google.ca/mypage/losethisfolder/',1);

function up($url, $howmany=1) {
    $p = explode('/', rtrim($url, '/'));
    if($howmany < count($p)) {
        $popoff = 0;
        while($popoff < $howmany) {
            array_pop($p);
            $popoff++;
        }
    }
    return rtrim(implode('/', $p), '/') . '/';
}

以下是虚拟路径的更优雅的解决方案:

$path = '/foo/../../bar/../something/../results/in/skipthis/../this/';

echo virtualpath($path);

function virtualpath($path = null) {
    $loopcount = 0;
    $vpath = $path;
    if(is_null($vpath)) { $vpath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); }
    $vpath = rtrim($vpath,'/') . '/';
    while(strpos($vpath,'../') !== false ) {
        if(substr($vpath,0,4) == '/../') { $vpath = '/'. substr($vpath,4); }
        $vpath = preg_replace('/(\/[\w\d\s\ \-\.]+?\/\.\.\/)/', '/', $vpath );
    }
    return $vpath;
}