<?php
 
class convertir_enlace
 
{
 
     public $log = array();
 
     public $este = array();
 
     public $es = "";
 
     private $re_dir = '%[\w\%\d\-]+/%i';
 
     private $re_prev = '%\.\./%i';
 
     function dir_enlace(){
 
        $this->este["raiz"] = str_replace('\x5c','/',$_SERVER["DOCUMENT_ROOT"]);
 
        $this->este["relativa"] = str_replace('\x5c','/',dirname($_SERVER["PHP_SELF"]));
 
      
 
        if(isset($_SERVER["HTTP_REFERER"]) && is_string($_SERVER["HTTP_REFERER"])){
 
            $httpas = preg_replace('%'.preg_quote($_SERVER["SCRIPT_NAME"]).'.*$%','',$_SERVER["HTTP_REFERER"]);            
 
        }else{
 
             $prot = (empty($_SERVER["HTTPS"])||$_SERVER["HTTPS"]=='off')?"http":"https";
 
             $httpas = $prot."://".$_SERVER["SERVER_NAME"].'/'.substr($this->este["relativa"],1).'/';
 
        }
 
        $this->este["url"] = str_replace('\x5c','/',$httpas);
 
        $this->este["url_arr"] = parse_url($this->este["url"]);
 
        
 
        $this->este["ruta"] = $this->este["raiz"].$this->este["relativa"];
 
        $este_inf = parse_url($this->este["raiz"]);
 
        $this->este["esquema"] = $este_inf["scheme"];
 
    }
 
    function convertir_enlace(){
 
         $link = (func_num_args()>0)?func_get_arg(0):$_SERVER["PHP_SELF"];
 
         $toUrl = (func_num_args()>1)?func_get_arg(1):true;
 
        $this->dir_enlace();
 
         if($toUrl){
 
            $this->es = $this->desde_ruta($link);
 
        }else{ // to relative path;
 
            $this->es = $this->desde_url($link);
 
        }
 
    }
 
    function desde_ruta($link){
 
        $info = parse_url($link);
 
        $este_inf = parse_url($this->este["ruta"]);
 
        if(!isset($info["scheme"]) || $info["scheme"]==$this->este["esquema"]){
 
             if(isset($info["scheme"])){
 
                $link = preg_replace('%'.preg_quote($this->este["raiz"]).'/%ims','',$link);
 
            }
 
            $info = pathinfo($link);
 
            $dirname = str_replace('\x5c','/',$info["dirname"]);
 
            $dirname = preg_replace('%([^\.])\./%','$1',$info["dirname"]);
 
            $retr = preg_match_all($this->re_prev,$info["dirname"]."/",$retrasos);
 
            $rtrn = true;
 
            $urldir = "/";
 
 
            if($retr>0){
 
                $prof = preg_match_all($this->re_dir,$this->este["url_arr"]["path"],$dirs);
 
                if($retr>$prof){
 
                    $this->log[] = "Path is deeper than url in ".$link;
 
                    $rtrn = false;
 
                }else{
 
                    for($p=0;$p<($prof-$retr);$p++){
 
                        $urldir .= $dirs[0][$p];
 
                    }
 
                }
 
                $link = preg_replace($this->re_prev,'',$link);
 
            }
 
            if($rtrn){
 
                $urldir .= preg_replace($this->re_prev,'',$link);
 
                $rtrn = $this->este["url_arr"]["scheme"]."://".$this->este["url_arr"]["host"].$urldir;
 
            }
 
        }else{
 
            $rtrn = $link;            
 
        }
 
        return $rtrn;        
 
    }
 
    function desde_url($link){
 
        $info = parse_url($link);
 
        if(isset($info["host"])){
 
            $a_este = str_split($this->este["url"]);
 
            $a_link = str_split($link);
 
            $debe = implode("",array_diff_assoc($a_link,$a_este));
 
            $sobra = implode("",array_diff_assoc($a_este,$a_link));
 
            $sobra = preg_replace('%//$%','/',$sobra);
 
            $profundiza = (strlen($sobra)>0)?preg_replace($this->re_dir,'../',$sobra):"";
 
 
            $rtrn = $profundiza.$debe;            
 
        }else{
 
            $rtrn = $link;
 
        }
 
        return $rtrn;
 
    }
 
}
 
?>
 
 |