我试图寻找一个类似的问题,但无法。
我在寻找推在正确的方向。 什么我目前所做的就是收集远程站点的所有HREF值的列表,现在因为其中一些可能是相对路径,我需要建立一个绝对路径的功能。
因为我有域名(按照最近使用的URL卷曲):
$base_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
现在让我们说$ BASE_URL值: http://www.example.com/home/index.html和href的值目前我正在阅读的是:/styles/ie.css
我需要把$ BASE_URL到的值http://www.example.com/styles/ie.css ,但我需要的功能是动态的,尽可能。 看看可能的方案(可能是不是所有的):
1 = base url
2 = relative path
------------------------------------------------
1 http://www.example.com/
2 java/popups.js
1 + 2 = http://www.example.com/java/popups.js
------------------------------------------------
1 http://www.example.com
2 java/popups.js
1 + / + 2 = http://www.example.com/java/popups.js
------------------------------------------------
1 http://www.example.com/mysite/
2 ../java/popups.js
1 - / + (2 - ..) = http://www.example.com/java/popups.js
------------------------------------------------
1 http://www.example.com/rsc/css/intlhplib-min.css
2 ../images/sunflower.png
1 - /css/intlhplib-min.css + (2 - ..) = http://www.example.com/rsc/images/sunflower.png
我想你会需要使用HREF路径正则表达式,以确保它是一致的。 您也可以从一个准确的基础URL parse_url ():
<?php
$href = '../images/sunflower.png';
$href = preg_replace('~^\.{0,2}\/~', '', $href);
?>
下面我们就从字符串的开头剥离周期和斜线。 然后在前面加上基本网址:
<?php
$url = 'http://www.example.com/home/index.html';
$url = parse_url($url);
$abspath = $url['scheme'] . '://' . $url['host'] . '/' . $href;
echo $abspath;
?>
如果输出你想要什么: http://www.example.com/images/sunflower.png
UPDATE
如果你想从基础URL的第一个目录,然后使用爆炸所解析的网址路径的关键:
$first_directory = '';
if (isset($url['path'])) {
$patharray = explode('/', $url['path']);
if (count($patharray)>2){
$first_directory = explode('/', $url['path'])[1] . '/';
}
}
并添加到输出变量:
$abspath = $url['scheme'] . '://' . $url['host'] . '/' . $first_directory . $href;
另一个更新
为了找到HREF值如何与基础URL,你可以搜索的发生../
或/
href值的开头,然后相应地调整你的绝对URL。 这应该可以帮助你找出场景是什么:
<?php
$href = '../../images/sunflower.png';
preg_match('~^(\.{0,2}\/)+~', $href, $matches); //preg_match to check if it exists
if (substr_count($matches[0], '../')){ // substr_count to count number of '../'
echo 'Go up ' . substr_count($matches[0], '../') . ' directories';
}
else if (substr_count($matches[0], '/')){
echo 'Root directory';
}
else {
echo 'Current directory';
}
?>
检查演示IDEONE 。
最后我写我自己的功能,从@bozdoz正确的方向推后。
该函数有两个参数,第一个是$资源,这是相对文件路径。 和第二个是在基础URL(其将被用于构建绝对URL)。
这是我的项目的目的设计,我不知道它是否适合任何人谁是寻找一个类似的解决方案。 随意使用它,并提供任何效率的提高。
版本更新感谢蒂姆·库珀
function rel2abs_v2($resource, $base_url)
{
$base_url = parse_url($base_url);
if(substr($resource, 0, 4) !== "http" && substr($resource, 0, 5) !== "https") // if no http/https is present, then {$resource} is a relative path.
{
# There is a "../" in the string
if (strpos($resource, "../") !== false)
{
$dir_count = substr_count($resource, "../");
$path_array = explode("/", $base_url["path"]);
$path_count = count($path_array); // 4
$path_index = ($path_count - $dir_count) - 2;
$resource = trim(str_replace("../", "", $resource));
if($path_index > 0) { $fs = "/"; }
if($dir_count > 0)
{
$base_url_path = implode("/", array_slice($path_array, $dir_count, $path_index - $dir_count + 1));
return $base_url['scheme'] . '://' . $base_url['host'] . $fs . $base_url_path ."/". $resource;
}
}
# Latest addition - remove if unexplained behaviour is in place.
if(starts_with($resource, "//"))
{
return trim(str_replace("//", "", $resource));
}
if (starts_with($resource, "/"))
{
return $base_url["scheme"] . "://" . $base_url["host"] . $resource;
}
else
{
$path_array = explode("/", $base_url["path"]);
end($path_array);
$last_id = key($path_array);
return $base_url["scheme"] . "://" . $base_url["host"] . "/" . $path_array[--$last_id] . "/" . $resource;
}
}
else
{
return $resource;
}
}