Aller au contenu

Générer l'url d'un lien relatif dans la page


Sujets conseillés

Posté

Je recherche une fonction qui me permettrait, en fonction de l'url de la page et d'une url relative dans la page, de générer automatiquement l'url définitive.

Vous savez si une fonction de ce genre existe déjà, ou s'il faut que je la crée de toutes pièces ?

Par exemple, une page du genre "www.monsite.com/rep/index.html" comporterai un lien "../racine.html". La fonction me renverrait une url du genre "www.monsite.fr/racine.html"

Merci d'avance !

Posté

As-tu besoin de cette adresse pour y accéder ou pour l'afficher ? Parce que si c'est juste pour y accéder, tu peux te permettre d'avoir l'adresse www.monsite.com/rep/../rep2/fichier.html", qui marche sous Linux.

Si tu veux l'afficher, tu peux partir de la même forme et d'appliquer la fonction "trouver /$1/../ et remplacer par /". Je n'ai pas trouvé de fonction propre qui te donnerait une absolue à partir d'une relative...

Tu veux une gestion des erreurs ?

Posté

Je vais tester avec ton exemple d'url ;)

En fait, je viens de me rendre compte que le site que je testais avait une balise "base href", ce qui complique encore un peu la donne ;)

Mais merci du tuyau !

Posté

Je viens de finir mon test ;)

Effectivement, un lien écrit comme tu me l'as fait fonctionne parfaitement (du moins avec CURL).

J'en profite pour poster ma "petite" fonction, en espérant qu'elle puisse resservir :

Elle permet de lister tous les liens d'une page donnée en argument (elle retourne un tableau de liens).

Elle autorise également deux types de filtres :

- On peut ne retourner que les liens internes au site, que les liens externes ou les deux

- On peut limiter le retour à une liste restreinte d'extensions

function liste_liens($url_page, $type = 'both', $liste_extensions = null) {
/* --------------------
La variable $type peut prendre trois valeurs : 'local', 'externe' et 'both'
local : les liens renvoyés sont des liens appartenant au même site
externe : les liens renvoyés sont tous les liens externes au site
both : les liens ne sont pas filtrés
Il est à noter qu'un lien dans un sous-domaine différent sera considéré comme un lien externe. Pareillement si les liens avec ou sans www renvoient pourtant la même url
La variable $liste_extensions permet de filtrer les résultats en fonction des extensions. Elle permet par exemple de ne récupérer que les liens pointant vers des images
Elle comporte une liste d'extensions séparées par des virgules
-------------------- */
$base_href = null;
// On analyse l'url de la page
$tab_url = parse_url($url_page);

// On commence par récupérer le code de la page
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url_page);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, 3);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$contenu = curl_exec($curl);

// On identifie si la page comporte une balise base href
$reg_base_href = '#<base href="(.*)".*>#Usi';
preg_match($reg_base_href, $contenu, $matches);
if(array_key_exists(1, $matches))
$base_href = $matches[1];

// On liste ensuite tous les liens de la page
$reg_liens = '#<a.*href="(.*)".*>#Usi';
preg_match_all($reg_liens, $contenu, $matches);
$tab_liens = $matches[1];

$reg_ancre = '|(#.*)$|Usi';
$reg_js_mailto = '#^(javascript|mailto):#';
$reg_debut_url = '#^(ftp|https?)://#';

if(!is_null($liste_extensions)) {
$tab_extensions = explode(',', strtolower($liste_extensions));
// On supprime les éventuels espaces devant les extensions
$tab_extensions = array_map('trim', $tab_extensions);
}

foreach($tab_liens as $key => $value) {
// On commence par supprimer toutes les ancres
$value = preg_replace($reg_ancre, '', $value);

// On supprime les liens javascrips et mailto
if(preg_match($reg_js_mailto, $value)) {
unset($tab_liens[$key]);
continue;
}

// On ne garde que les liens ayant l'extension souhaitée
if($liste_extensions) {
// On commence par prendre l'extension du fichier
$extension = strtolower(substr($value, strrpos($value, '.')+1, strlen($value)));
if(!in_array($extension, $tab_extensions)) {
unset($tab_liens[$key]);
continue;
}
}

// On transforme toutes les urls relatives en absolues
if(!preg_match($reg_debut_url, $value)) {
if($base_href)
$value = $base_href.$value;
else
$value = substr($url_page, 0, strrpos($url_page, '/')+1).$value;
}

// On supprime éventuellement les urls externes ou internes
$tab_url_lien = parse_url($value);
if($type == 'local' && $tab_url_lien['host'] != $tab_url['host']) {
unset($tab_liens[$key]);
continue;
}
elseif($type == 'externe' && $tab_url_lien['host'] == $tab_url['host']) {
unset($tab_liens[$key]);
continue;
}

$tab_liens[$key] = $value;
}

// On supprime les doublons
$tab_liens = array_unique($tab_liens);

return $tab_liens;
}

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...