Extraction de liens avancée

Contenu du snippet

Cette source complète la suivante :
http://www.phpcs.com/code.aspx?ID=13443
mais permet surtout d'exploiter directement (création d'un tableau) les liens avec quelques options de formattage et de filtrage.

Source / Exemple :


<?php
/**

  • FReD - derfum@free.fr
  • Extraction de liens
  • renvoie un tableau associatif multidimentionnel
  • contenant l'adresse cible et le contenu de la balise
  • ou faux si erreur ou aucun lien
  • Options (Somme pour combiner les options) :
  • - 0: aucune
  • - 2: Trier le tableau par contenu (tri par position par défaut)
  • - 4: Trier par contenu et dédoublonner
  • - 8: Supprimer les liens scripts (javascript:)
  • - 16: Supprimer les liens email (mailto:)
  • - 32: Supprimer les ancres locales (#)
  • - 64: Supprimer les liens locaux
  • - 128: Simplifier les images
  • /
function ExtractLien($PFichier, $POptions = 0) { if (!is_file($PFichier)) { echo 'Erreur : Le parametre n\'est pas un fichier'; return false; } $LReturn = array(); $LFichier = implode('', file($PFichier)); preg_match_all('%<a (.*?)href=("|\')(.+?)("|\')(.*?)>(.+?)</a>%i', $LFichier, $LMatch, PREG_SET_ORDER); if ($POptions >= 128) { // Simplification images $POptions -= 128; $POpImg = true; } else $POpImg = false; if ($POptions >= 64) { // suppression des locaux $POptions -= 64; $POpLoc = true; } else $POpLoc = false; if ($POptions >= 32) { // suppression des ancres $POptions -= 32; $POpA = true; } else $POpLoc = false; if ($POptions >= 16) { // suppression des mailto: $POptions -= 16; $POpLien = true; } else $POpLien = false; if ($POptions >= 8) { // suppression des javscript: $POptions -= 8; $POpJS = true; } else $POpJS = false; foreach($LMatch as $LLiens) { if ($POpImg && preg_match('/^<img (.*)src=("|\')(.+?)("|\')/i', $LLiens[6], $LImg)) { $LLiens[6] = '[IMAGE : ' . $LImg[3] . ']'; } if ($POpA && $LLiens[3]{0} == '#') continue; if ($POpLien && substr($LLiens[3], 0, 7) == 'mailto:') continue; if ($POpJS && substr($LLiens[3], 0, 11) == 'javascript:') continue; if ($POpLoc && strstr($LLiens[3], ':') === false) continue; $LReturn[] = array($LLiens[6], $LLiens[3]); } unset($LMatch); if ($LCount = count($LReturn)) { if ($POptions >= 2) { // Tri $POptions -= 2; array_multisort($LReturn); } if ($POptions >= 2) { // Dedoublonnage : array_unique ne marche pas... $POptions -= 2; if ($LCount > 1) { $LTemp = $LReturn[0]; // Existe obligatoirement for($i = 1;$i <= $LCount;$i++) { if ($LReturn[$i] == $LTemp) { unset($LReturn[$i]); } else { $LTemp = $LReturn[$i]; } } sort($LReturn); // Permet de reindexer le tableau } } return $LReturn; } else return false; //Pas de lien } /**
  • Formatte un tableau en liste de liens
  • /
function FormatLien($PTableau) { $LReturn = '<ul>'; foreach($PTableau as $LLiens) { $LReturn .= '<li><a href="' . $LLiens[1] . '">' . $LLiens[0] . ' [' . $LLiens[1] . ']</a></li>'; } return $LReturn . '</ul>'; } ?>

Conclusion :


La fonction FormatLien est juste l'exemple le plus simple d'utilisation du tableau retourné.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.