nouvelle adresse // // suivre_lien('http://rezo.net/sous/dir/../ect/ory/fi.html..s#toto', // 'a/../../titi.coco.html/tata#titi'); // http://doc.spip.org/@suivre_lien function suivre_lien($url, $lien) { if (preg_match(',^(mailto|javascript):,iS', $lien)) return $lien; if (preg_match(',^([a-z0-9]+://.*?)(/.*)?$,iS', $lien, $r)) return $r[1].resolve_path($r[2]); # L'url site spip est un lien absolu aussi if ($lien == $GLOBALS['meta']['adresse_site']){ return $lien; } # lien relatif, il faut verifier l'url de base # commencer par virer la chaine de get de l'url de base if (preg_match(',^(.*?://[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$,S', $url, $regs)) { $debut = $regs[1]; $dir = !strlen($regs[2]) ? '/' : $regs[2]; $mot = $regs[3]; $get = isset($regs[4])?$regs[4]:""; $hash = isset($regs[5])?$regs[5]:""; } #var_dump(array('url'=>$url,'debut'=>$debut,'dir'=>$dir,'mot'=>$mot,'get'=>$get,'hash'=>$hash)); switch (substr($lien,0,1)) { case '/': return $debut . resolve_path($lien); case '#': return $debut . resolve_path($dir.$mot.$get.$lien); case '': return $debut . resolve_path($dir.$mot.$get.$hash); default: return $debut . resolve_path($dir.$lien); } } // un filtre pour transformer les URLs relatives en URLs absolues ; // ne s'applique qu'aux #URL_XXXX // http://doc.spip.org/@url_absolue function url_absolue($url, $base='') { if (strlen($url = trim($url)) == 0) return ''; if (!$base) $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : ''); return suivre_lien($base, $url); } // un filtre pour transformer les URLs relatives en URLs absolues ; // ne s'applique qu'aux textes contenant des liens // http://doc.spip.org/@liens_absolus function liens_absolus($texte, $base='') { if (preg_match_all(',(<(a|link|image)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) { foreach ($liens as $lien) { $abs = url_absolue($lien[3], $base); if ($abs <> $lien[3] and !preg_match('/^#/',$lien[3])) $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte); } } if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) { foreach ($liens as $lien) { $abs = url_absolue($lien[3], $base); if ($abs <> $lien[3]) $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte); } } return $texte; } // // Ce filtre public va traiter les URL ou les // // http://doc.spip.org/@abs_url function abs_url($texte, $base='') { if ($GLOBALS['mode_abs_url'] == 'url') return url_absolue($texte, $base); else return liens_absolus($texte, $base); } ?>