Publié le 22/10/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Construire un lien absolu a partir d'une URL relative

Sur un site internet, les liens sont insérer dans le code HTML et peuvent s'écrire sous forme de lien absolu ou sous forme de lien relatif. Le navigateur internet comprend parfaitement les manières d'écrire un lien internet. Lorsque l'on veut analyser l'arborescence d'un site web, les url relatives sont étendues à la syntaxe complète pour pouvoir faire des tri ou extraire les liens externes.

Passer d'un lien relatif à un lien absolu

En parsant une source HTML avec DOMDocument, on se rend compte que les liens prennent les formats suivants:
- url absolue: ce sont des adresses URL complètes, incluant le protocole de serveur (en généralement http://),
exemple: http://monsite.com/index.php
- url relative: les adresses sont indiquées par rapport au dossier contenant le document source.
exemple: ../image/graph.jpg
La class AbsoluteURL est un exemple comment passer d'un lien relatif vers un lien absolue.
<?php
/**
 * Construire une URL absolue
 * fobec 2010
 */
class AbsoluteURL {
 
    public static function merge($absolute, $relative) {
        $p = parse_url($relative);
        if(isset($p["scheme"])&&$p["scheme"])return $relative;
 
        extract(parse_url($absolute));
        $path = dirname($path);
        if($relative{0} == '/') {
            $cparts = array_filter(explode("/", $relative));
        }
        else {
            $aparts = array_filter(explode("/", $path));
            $rparts = array_filter(explode("/", $relative));
            $cparts = array_merge($aparts, $rparts);
            foreach($cparts as $i => $part) {
                if($part == '.') {
                    $cparts[$i] = null;
                }
                if($part == '..') {
                    $cparts[$i - 1] = null;
                    $cparts[$i] = null;
                }
            }
            $cparts = array_filter($cparts);
        }
        $path = implode("/", $cparts);
        $url = "";
        if($scheme) {
            $url = "$scheme://";
        }
        if(isset($user)&&$user) {
            $url .= "$user";
            if($pass) {
                $url .= ":$pass";
            }
            $url .= "@";
        }
        if($host) {
            $url .= "$host/";
        }
        $url .= $path;
        return $url;
    }
}
/**
 * Exemple
 */
 
$url = "http://www.monsite.com/beta/index.html";
$rel = "./images/graph.jpg";
echo AbsoluteURL::merge($url, $rel);
?>

Test d'assemblage d'url

La première étape consiste à détecter le protocole de communication, puis le nom de domaine. A partir de ces données, la class y ajoute le répertoire courant et l'url relative.

Tests d'assemblage d'URL
AbsoluteURL::merge("http://www.monsite.com/beta/index.html", "./images/graph.jpg");
=> resultat: http://www.monsite.com/beta/images/graph.jpg

AbsoluteURL::merge("http://www.monsite.com/beta/index.html", "../images/graph.jpg");
=> resultat: http://www.monsite.com/images/graph.jpg
fgdgf


Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
22/10/2010
Visualisation
vu 3495 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Melo12 dans php5

Super article. Merci

Publié par IB dans tuto

Merci ca marche bien.

Publié par piranhas dans java

bonjour, je veux te signaler que la piece jointe est fausse car il n\'y pas de liaison entre le modele et la vue, toutes le information passe par le controlleur.

Publié par Fobec dans java

As-tu essaye sans le parametre de la cle ?
(supprimer la ligne url += "&key=" + this.ApiKey;)
A priori, cela fonctionne sans aucune authentification sur l'api ;)

Publié par Fobec dans tuto

Merci pour la remarque Toluar,
Les user-agent sont effectivement un bon indicateur pour les utilisateurs. Les crawlers et robots en tout genre ne prennent pas toujours la peine de renseigner cette...