转换远程相对路径绝对路径(Converting remote relative paths to a

2019-10-18 05:59发布

我试图寻找一个类似的问题,但无法。

我在寻找推在正确的方向。 什么我目前所做的就是收集远程站点的所有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     

Answer 1:

我想你会需要使用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 。



Answer 2:

最后我写我自己的功能,从@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;
}
} 


文章来源: Converting remote relative paths to absolute paths
标签: php html parsing