| 
<?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;
 }
 }
 ?>
 |