IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] Extracteur de liens depuis la source


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut [Système] Extracteur de liens depuis la source
    Saluté...
    Je bosse sur un système de moteur de recherche en ce moment. j'essaye d'optimiser tout ça avec des regex... bon l'idée est de pouvoir récupérer tous les liens d'une page depuis son code source ...
    le problème est qu'il existe pluiseurs types de liens
    ceux commencant
    par http
    par ./
    par ../
    par dossier/
    par /dossier/

    ou ceux étant simplement un nom de fichier
    genre <a href="index.php">accueil</a>

    ensuite on a les variables passées en get à prendre en compte ...donc tout ce qui suit le nom de fichier et qui commence par un ?

    ok ...deja tout ça c'est pas mal ... mais bien sur il faut éviter de prendre les javascript tout en récupérant les liens qui peuvent y être
    genre la dedans

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="javascript:window.open('pagepopup.php','newsletter_exemple', 'status=yes,resizable=yes,scrollbars=yes,width=610,height=500'); void(0); " onMouseover="document.newsimg.src='http://medias.lemonde.fr/mmpub/img/ep/news-5.jpg';"><b>Titres du jour</b></a> : Du lundi au vendredi, les titres de l'actualit&eacute; d&eacute;velopp&eacute;s sur Le Monde.fr.<br><br>

    il faut récupérer pagepopup.php

    bon ...j'ai bossé sur une regex qui est pas mal mais qui ne fonctionne pas encore au top
    j'aurai besoin d'un coup de main pour la paufiner ... pour mes tests j'utilise le code source de la page "lemonde.fr" qui comporte plein de types de liens ou ue page de tests à moi...

    voici ma regex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // recuperation de la source
    $fichier = fopen($_GET['url'], 'r', false);
    $src = '';
    while ($str=fread($fichier, 16))
    {
      $src .= $str;
    }
    fclose($fichier);
     
     preg_match_all('%(("|\')(http|./|../|/|[a-z0-9]+/)(.+?)(\.html|\.php|\.php3|\.php4|\.php5|\.htm|\/|\.asp)("|\'))|(("|\')([a-z0-9])+(\.html|\.php|\.php3|\.php4|\.php5|\.htm|\/|\.asp)(\?)(.+?)+("|\'))%im', $fichier, $lnk2, PREG_OFFSET_CAPTURE);
      echo '<textarea rows="20" cols="50" style="width:700px;">';
     print_r($lnk2);
     echo '</textarea>';
    bon je suis pas un pro des regex mais j'y travaille

    ma regex me sort pour l'instant des liens mais avec trop d'options
    genre

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [0] => "/web/recherche_resultats/1,13-0,1-0,0.html"
                        [1] => 4393
                    )
    
                [1] => Array
                    (
                        [0] => "/web/inscription_newsletter/1,27-0,1-0,0.html"
                        [1] => 6121
                    )
    
                [2] => Array
                    (
                        [0] => "http://www.lemonde.fr/web/sequence/0,2-3208,1-0,0.html"
                        [1] => 6944
                    )
    
                [3] => Array
                    (
                        [0] => "http://medias.lemonde.fr/mmpub/img/tit/nav-une.gif"  alt="Home" border="0" height="27"></a></td><td id="m_ann_1129"><a href="http://www.lemonde.fr/web/sequence/0,2-3208,1-0,0.html"
                        [1] => 7111
                    )
    
                [4] => Array
                    (
                        [0] => "http://medias.lemonde.fr/mmpub/img/tit/nav-act.gif"  alt="Actualités" border="0" height="27"></a></td><td id="m_ann_1130"><a href="http://www.lemonde.fr/web/sequence/0,2-3232,1-0,0.html"
                        [1] => 7409
                    )


    etc etc...
    d'où le pb... j'aimerai récupérer juste les liens

    l'expression que je cherche pourrait se traduire comme ça

    commence par " ou '
    http ou ./ ou ../ ou un nom de dossier suivi de slash
    continue avec
    une chaine de caractère quelconque mais pas d'espace
    continue avec
    un point suivi d'une extension parmis htm, html, php, php3, php4, php5, asp (à compléter...)
    suivi éventuellement par un ?
    suivi par une chaine de caractère sans espaces
    termine par "ou ' (obligatoirement le même qu'au début)

    en gros avec ça on doit pouvoir extraire tous les liens ... même ceux contenus dans les javascript ... reste à le formaliser.
    je pense que ce qui cloche dans ma regex (le principal pb) est que
    (.+?) signifie toute chaine de caractère ... alors que je voudrai avoir lettres plus chiffres plus _ plus - uniquement
    ce qui devrai se traduire par [a-z0-9-_]* mais quand je rentre ça ça ne marhe pas ... j'obtient un gros vide en sortie...

    j'espère qu'un calé en regex pourra m'aiguiller ..
    @++ et merciiiii !!!

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    Bon ... ben moi je continue de chercher ...
    pour le moment j'en suis là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('%(("|\')(https?\://|\./|\.\./|[a-z0-9]+/|/[a-z0-9-_]*/).+?(\.)(htm(l?)|asp|php[2-5]?)+(\?)?(.*)("|\'))|(("|\')[a-z0-9-_]*(\.)(htm(l?)|asp|php([2-5]?))+(\?)?(.*)("|\'))%im', $src, $lnk2, PREG_OFFSET_CAPTURE);
    c'est presque ça sauf que ça me sort les javascript entiers ...
    please help !

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Par défaut
    allé ... même si personne n'a répondu je suis bon joueur je vous donne la regex ultime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $p = '(("|\')([a-z0-9-_]*|(https?\://|\./|\.\./|/?[a-z0-9-_]*/)[-A-Z0-9+&@#/=?_|!:,.;\%]*)(\.)(php[2-5]?|x?html?|aspx?){1}(\?[-A-Z0-9+&@#/=~_|!:,.;\%]*)?("|\'))';
     
       preg_match_all('%'.$p.'%i', $src, $lnk2);
      echo '<textarea rows="20" cols="50" style="width:700px;">';
     print_r($lnk2);
     echo '</textarea>';
     echo count($lnk2[0]);

    allé @+

  4. #4
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    C'est franchement pas plus simple mais perso j'ai fait ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('`(\'|")((?:https?://|\.|\.\.|/?[a-z0-9_-]*/)[a-z0-9_-%/.]+\.[a-Z0-9]{3,5}(?:(?:\?|=|&|&amp;|#)[a-z0-9_-%]+)*)$1`Ui', $code, $matches);

Discussions similaires

  1. [Système]commandes linux / unix depuis java
    Par msiramy dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 20/03/2007, 11h29
  2. Les liens depuis Thunderbird ne marchent pas
    Par Cazaux-Moutou-Philippe dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 20/03/2006, 22h27
  3. Réponses: 4
    Dernier message: 09/11/2005, 18h44
  4. Liens depuis une base de donnée statique
    Par LucG dans le forum Access
    Réponses: 4
    Dernier message: 26/10/2005, 11h12
  5. Réponses: 4
    Dernier message: 21/04/2005, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo