因为一些学习和研究目的,最近在写一些数据抓取的组件,在网页上很常见的是相对链接,有时候因为所在网页和相对链接的关系不太确定,所以就需要转换一下,本来这个功能实在太简单,直接在网上搜索了一下,但是发现绝大部分代码都是错的,或者说不严谨,随便改一个目录深度就会发生错误。
这里贴一下我的解决方案:
class spider{
/*
$rel string 相对链接
$baseURL string 当前所在页面完整地址
*/
public function absoluteURL( $rel, $baseURL ): string
{
$url = parse_url($baseURL);
/* 处理当前网页链接深度 */
$depthPath = [];
foreach ( explode('/',$url['path']) as $i => $p ){
if( $p != '' ){
$depthPath[] = $p;
}
}
$pathDeep = count($depthPath);
/* 处理相对链接深度、向上深度 */
$relDepth = [];
$rootPath = false;
foreach ( explode("/",$rel) as $i => $r){
if( $i==0 && $r == '' ){
$rootPath = true;
}
if( $r != '' ){
$relDepth[] = $r;
}
}
$backPathDepth = strlen(strstr( $relDepth[0],'.' )) - 1; // 向上几层
/* 拼接 */
$new_url = $url['scheme'] . '://' . $url['host'];
if( !$rootPath ){ // 判断是否属于根目录
for( $i = 0; $i < $pathDeep - $backPathDepth; $i++ ){
$new_url .= ('/'.$depthPath[$i]);
}
}
// 排除第一个深度参数
for ( $i = 1; $i < count($relDepth); $i ++ ){
$new_url .= ('/'.$relDepth[$i]);
}
return $new_url;
}
}