在我提出问题之前,我想说我已经尝试过从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}}这不是我想要的。
答案 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;
}