PHP取远程文件绝对路径
写采集程序的时候, 需要根据 当前页 和 下一页 计算出 下一页的绝对地址,写了一个常用的转换函数, 方便以后采集转换地址。
第一个参数是相对页面的url, 第二个参数是采集到的下一页地址, 然后就会返回一个带有http的下一个地址。
<?php
function get_abs_url($url, $filename) {
// 如果是http|https|ftp|//开头的
if (preg_match('/^[a-zA-Z]*\:?\/\//', $filename)) {
return $filename;
}
// 如果是 /common/css/index.css
if (substr($filename, 0, 1) == '/') {
preg_match('/^[^\/]*\/\/[^\/]+/', $url, $domain);
return $domain[0] . $filename;
}
// 去掉问号和#号后面的字符, 删除文件名, 只保留目录
$url = strstr($url, '?', true) ? strstr($url, '?', true) :
(strstr($url, '#', true) ? strstr($url, '#', true) : $url);
$url = preg_replace('/[^\/]*$/', '', $url);
// 如果是 ../../common/css/index.css
if (substr($filename, 0, 3) == '../') {
$filename = $url . $filename;
while (preg_match('/[^\/\.]+\/\.\.\//', $filename)) {
$filename = preg_replace('/[^\/\.]+\/\.\.\//', '', $filename);
}
return $filename;
}
// 如果是 ./common/css/index.css
if (substr($filename, 0, 2) == './') {
return str_replace('/./', '/', $url . $filename);
}
return $url . $filename;
}
实现了下面几种模式:
echo get_abs_url('http://www.baidu.com/blog/shuai/article/1.html?php=php#hello', '../../../common/css.css');
echo '<br />';
echo get_abs_url('http://www.baidu.com/blog/shuai/article/1.html?php=php#hello', 'http://static.baidu.com/common/css.css');
echo '<br />';
echo get_abs_url('http://www.baidu.com/blog/shuai/article/1.html?php=php#hello', '/common/css.css');
echo '<br />';
echo get_abs_url('http://www.baidu.com/blog/shuai/article/1.html?php=php#hello', './common/css.css');
echo '<br />';
echo get_abs_url('http://www.baidu.com/blog/shuai/article/1.html?php=php#hello', 'css.css');