Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXTRACTION DE LIENS AVANCÉE


Information sur la source

Catégorie :Fichier / Disque Niveau : Débutant Date de création : 04/07/2004 Vu : 2 656

Note :
4 / 10 - par 2 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

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

  • <?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>';
  • }
  • ?>
<?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é.
 

Commentaires et avis

signaler à un administrateur
Commentaire de GRenard le 05/07/2004 00:09:19

OMG, ta gestion des bits peut être fait différamment et beaucoup mieux !
Au lieu de faire comme tu fais tu compares chaque bits plutot !
De la sorte :
if(($POptions & 128)==128)

et ainsi tu sauves pleins de if et tu n'as plus besoin de passer dans les variables true ou false.

signaler à un administrateur
Commentaire de defkrie le 05/07/2004 13:26:42

Oui elle toujours mieux que la mienne codée en 3 minutes à l'adresse suivantes http://www.phpcs.com/code.aspx?ID=13443...

signaler à un administrateur
Commentaire de derfum le 05/07/2004 17:00:51

Merci du conseil pour if($var & 128) == 128), je vais tester pour voir comment ça marche, et je mets rapidement à jour.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.