Andy's Blog » php 绝对地址, php 相对地址, php 相对地址转绝对地址, php绝对地址, php 网络地址 绝对地址, php 计算绝对地址, 把相对地址转成绝对地址 php, php 绝对地址转相对地址, wordpress 相对地址换绝对地址, snoopy 绝对地址, php 转绝对地址 » PHP将相对地址转成绝对地址

PHP将相对地址转成绝对地址

PHP将相对地址转成绝对地址

1. 网上找到的一个函数

function real_url($url,$URI) {   
    
$URI_PARTS = parse_url($URI);
    
$pnum = substr_count($url,"../");   
    
if(substr($url,0,1) == "/") $url = "http://".$URI_PARTS["host"].$url;   
    
if(substr($url,0,2) == "./") $url = dirname($URI).substr($url,1);   
    
if($pnum>0) {   
        
for($i=0;$i< ($pnum+1);$i++) {   
            
$URI = dirname($URI);   
        
}   
        
$url = str_replace("../","",$url);   
        
$url = $URI."/".$url;   
    
}   
    
return $url;   
}

2. 把Snoopy里的expandlinks挖出来看看

function _expandlinks($links,$URI) {
 
    
preg_match("/^[^\?]+/",$URI,$match);
 
    
$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
    
$match = preg_replace("|/$|","",$match);
    
$match_part = parse_url($match);
    
$match_root = $match_part["scheme"]."://".$match_part["host"];
            
    
$search = array(     "|^http://".preg_quote($match_part["host"])."|i",
                        
"|^(\/)|i",
                        
"|^(?!http://)(?!mailto:)|i",
                        
"|/\./|",
                        
"|/[^\/]+/\.\./|"
                    
);
                    
    
$replace = array(    "",
                        
$match_root."/",
                        
$match."/",
                        
"/",
                        
"/"
                    
);           
            
    
$expandedLinks = preg_replace($search,$replace,$links);
 
    
return $expandedLinks;
}

2007年11月26日补充:
今天又把DEDE的下载类里的2个函数挖出来并整理了一下,表现也不尽完美,唉
另发现DEDE的作者很喜欢用@,有篇文章里说@影响性能

function FillUrl($surl, $URI)
{
    
$urls = @parse_url($URI);
    
$_HomeUrl = $urls["host"];
    
$_BaseUrlPath = $_HomeUrl . $urls["path"];
    
$_BaseUrlPath = preg_replace("/\/([^\/]*)\.(.*)$/", "/", $_BaseUrlPath);
    
$_BaseUrlPath = preg_replace("/\/$/", "", $_BaseUrlPath);
 
    
$i = 0;
    
$dstr = "";
    
$pstr = "";
    
$okurl = "";
    
$pathStep = 0;
    
$surl = trim($surl);
    
if ($surl == "")
        
return "";
    
$pos = strpos($surl, "#");
    
if ($pos > 0)
        
$surl = substr($surl, 0, $pos);
    
if ($surl[0] == "/") {
        
$okurl = "http://" . $_HomeUrl . $surl;
    
} else
        
if ($surl[0] == ".") {
            
if (strlen($surl) < = 1)
                
return "";
            
else
                
if ($surl[1] == "/") {
                    
$okurl = "http://" . $_BaseUrlPath . "/" . substr($surl, 2, strlen($surl) - 2);
                
} else {
                    
$urls = explode("/", $surl);
                    
foreach ($urls as $u) {
                        
if ($u == "..")
                            
$pathStep++;
                        
else
                            
if ($i < count($urls) - 1)
                                
$dstr .= $urls[$i] . "/";
                            
else
                                
$dstr .= $urls[$i];
                        
$i++;
                    
}
                    
$urls = explode("/", $_BaseUrlPath);
                    
if (count($urls) <= $pathStep)
                        
return "";
                    
else {
                        
$pstr = "http://";
                        
for ($i = 0; $i < count($urls) - $pathStep; $i++) {
                            
$pstr .= $urls[$i] . "/";
                        
}
                        
$okurl = $pstr . $dstr;
                    
}
                
}
        
} else {
            
if (strlen($surl) < 7)
                
$okurl = "http://" . $_BaseUrlPath . "/" . $surl;
            
else
                
if (strtolower(substr($surl, 0, 7)) == "http://")
                    
$okurl = $surl;
                
else
                    
$okurl = "http://" . $_BaseUrlPath . "/" . $surl;
        
}
        
$okurl = eregi_replace("^(http://)", "", $okurl);
    
$okurl = eregi_replace("/{1,}", "/", $okurl);
    
return "http://" . $okurl;
}

现在,对以上3个函数进行测试

测试数据

$URI = "http://www.21andy.com/1/2/3/4/5/6/xxx.html";
$url[] = "http://www.21andy.com/html/test.jpg";
$url[] = "/html/a/b/c/test.jpg";
$url[] = "../../test.jpg";
$url[] = "./../..//../html/dir/./andy/test.jpg";

第一个函数不支持数组

foreach($url AS $val) {
    
echo real_url($val).'<br />';
}

结果:

http://www.21andy.com/html/test.jpg
http://www.21andy.com/html/a/b/c/test.jpg
http://www.21andy.com/1/2/3/4/test.jpg
http://www.21andy.com/1/2/3/http://www.21andy.com/1/2/3/4/5/6//html/dir/./andy/test.jpg

DEDE里挖出来的那个函数

foreach($url AS $val) {
    
echo FillUrl($val).'<br />';
}

结果:

http://www.21andy.com/html/test.jpg
http://www.21andy.com/html/a/b/c/test.jpg
http://www.21andy.com/1/2/3/4/test.jpg
http://www.21andy.com/1/2/3/4/5/6/../../../html/dir/./andy/test.jpg

Snoopy挖出来的函数

print_r(_expandlinks($url,$URI));

结果:

Array
(
[0] => http://www.21andy.com/html/test.jpg
[1] => http://www.21andy.com/html/a/b/c/test.jpg
[2] => http://www.21andy.com/1/2/3/4/5/../test.jpg
[3] => http://www.21andy.com/1/2/3/4/5/..//../html/dir/andy/test.jpg
)

结论: 以上3者表现都不够完美,不过我的测试数据也比较变态了一点
Snoopy支持数组,其他的不支持,不过可以加入
Snoopy对../../解析得不够完美,DEDE那个函数这点上做得稍好点

Incoming search terms:

Tags: PHP, 函数

本文地址: http://www.21andy.com/new/20071126/698.html

2 评论 to “PHP开源CMS之MODx”

  1. fmooo 于 2008-01-03 15:13:46 发表:

    呵呵

    dede里面的东西确实比较喜欢 @ 和 #@_

  2. yangsi 于 2014-08-11 18:44:24 发表:

    个例太多了 . 浏览器的源代码里面是不是有处理相对地址的函数啊 .