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