PHP - 将相对链接转换为绝对URL

时间:2016-04-06 22:42:57

标签: php url hyperlink absolute relative

这适用于PHP中的Web爬网程序。基本上,给定基本URL和相对链接,我需要返回结果链接的实际/绝对URL。

实施例: 基本网址:http://www.somewebsite.com/files/page.html 链接:../ index.php

结果:http://somewebsite.com/index.php

是否存在执行此操作的库或手动编码的方法?

2 个答案:

答案 0 :(得分:2)

此功能将将相对网址解析为$pgurl 中的给定当前页面网址,而不使用正则表达式。它成功解决了:

/home.php?example种类,

same-dir nextpage.php类型,

../...../.../parentdir种类,

完整的http://example.net网址,

和简写//example.net网址

//Current base URL (you can dynamically retrieve from $_SERVER)
$pgurl = 'http://example.com/scripts/php/absurl.php';

function absurl($url) {
 global $pgurl;
 if(strpos($url,'://')) return $url; //already absolute
 if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme
 if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain
 if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed
 return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename
}

function nodots($path) { //Resolve dot dot slashes, no regex!
 $arr1 = explode('/',$path);
 $arr2 = array();
 foreach($arr1 as $seg) {
  switch($seg) {
   case '.':
    break;
   case '..':
    array_pop($arr2);
    break;
   case '...':
    array_pop($arr2); array_pop($arr2);
    break;
   case '....':
    array_pop($arr2); array_pop($arr2); array_pop($arr2);
    break;
   case '.....':
    array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2);
    break;
   default:
    $arr2[] = $seg;
  }
 }
 return implode('/',$arr2);
}

用法示例:

echo nodots(absurl('../index.html'));
在将URL转换为绝对值后,

nodots()必须被称为

点功能有点冗余,但是可读,快速,不使用正则表达式,并且将解析99%的典型网址(如果你想100%确定,只需扩展交换机块以支持6+点,虽然我从未在网址中看到过那么多点。)

希望这有帮助,

答案 1 :(得分:0)

.htaccess和正则表达式可以解决这个问题。发现了类似的讨论:Redirect URL to custom URL through .htaccess