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 :

récupérer tous les liens d'une page [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut récupérer tous les liens d'une page
    Bonjour,

    J'aimerais faire un ptit bout de code qui permettrait de trouver tous les liens dans une page et de les ouvrir dans une nouvelle fenêtre a chaque fois...

    Est-ce possible ? Pouvez-vous m'aider ? Par ou dois-je commencer svp ?

    Merci
    ++

  2. #2
    Membre averti Avatar de gofono_bass
    Inscrit en
    Décembre 2005
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2005
    Messages : 383
    Points : 448
    Points
    448
    Par défaut
    Salut,
    A mon avis, tu devrais commencer par les etapes suivantes :
    - prendre le contenu de la page (le code HTML donc) soit avec fsockopen soit avec CURL
    - tu recherches les liens avec des expressions régulières
    - tu affiches les pages..
    mais pourquoi tu cours?

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Ok mais en fait c'est surtout pour les expressions régulieres que ca se complique, ca devient plus délicat, parce que j'aimerais ouvrir tous les liens, même si c'est du type http://www.url.com/page.php?go=111&p=5555

    Enfin vraiment toutes les urls quoi et non ceux du type www.domaine.com


    Et après je pense le deuxieme probleme, c'est pour le fait d'ouvrir chaque lien dans une nouvelle page, je me demande meme si c'est possible avec php ? Ne faut-il pas passer par du javascript ?

    MErci
    ++

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Re, c'est encore moi, voila j'ai du trouvé du javascript pour ouvir une fenetre a chaque fois grave a un for en php mais maintenant il me faut une expression réguliere pour récuperer dans une chaine de caractere $texte toutes les urls présentes...

    Merci
    ++

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    va voir cette page http://lyhana8.free.fr/index.php?include=source.php&wsc=source.php
    c'est une page a moi qui me permet d'afficher les sources de mes script et remplaçant les nom de fichier .php, .js ou . htm par un lien pointant vers eux. Pour ca j'utilise des expression regulieres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $h_str = eregi_replace("(['\" =])(([a-zA-Z0-9_-]+)\.(php|css|js|htm))([\?'\" ])", "\\1<a href='index.php?include=source.php&amp;wsc=\\2' >\\2</a>\\5", highlight_file($p_file, TRUE));
    la chaine sera de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (['\" =])(([a-zA-Z0-9_-]+)\.(php|css|js|htm))([\?'\" ])
    et remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \\1<a href='index.php?include=source.php&amp;wsc=\\2' >\\2</a>\\5
    On travaillera avec la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    highlight_file($p_file, TRUE)
    bon vite fais: les \\numero correspondante aux different block de parenthese (le numero indique la parenthese ouvrante du bloc).
    par exemple ici \\1 sera remplacer par l'un des caracteres suivants : (celui qu'elle aura trouver, ya un espace !).
    toi en gros il faut que tu recherche les truc genre
    Donc j'espere que tu es pas trop bordelique niveau guillemets espace ou autre dans tes balises sinon ca va etre un peu plus galere.
    Pour ta chaine regexp va voir ca http://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re (si t'y connais rien en regexp ca pourra t'aider un peu).
    Je peu te proposer ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (href=")(([a-zA-Z0-9_-]+)\.(php|htm))(\?[a-zA-Z0-9_-&=]*)(\")
    decoupage des parametres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    \\1 (href=")
    \\2 (([a-zA-Z0-9_-]+)\.(php|htm))
    \\3 ([a-zA-Z0-9_-]+)
    \\4 (php|htm)
    \\5 (\?[a-zA-Z0-9_-&=]*)
    la chaine de remplacement (que tu utilisera pour ton javascript) sera du type:
    Ce qui devrai donc donner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $js = eregi_replace("(href=")(([a-zA-Z0-9_-]+)\.(php|htm))(\?[a-zA-Z0-9_-&=]*)(\")",  "href='\\2\\5'", $ch);
    $ch la source de ton fichier htm je suppose.
    Mai je ne garanti rien, les regexp, c'est tout un art il te faudra peut etre modifier le 1er parametre de eregi_replace
    bonne chance

  6. #6
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    très bon post avec de très bonne explications, par contre essaie de travailler avec les expressions régulières perl qui sont plus performante

    preg_replace()

    Pierre
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    euh oui merci mais j'ai pas vraiment tout compris la... je sais pas si t'as vraiment compris ce que je cherchais a faire en fait...

    Par exemple, j'ai ceci, j'ai un texte dans la variable $texte :

    $texte="Slt, ca va, une adresse http://www.domaine.com et puis ca aussi http://www.domaine.com/page.php?aaa=eee&bbbb=ffff et voila, aller encore une http://www.aaaa.com/index.php !"

    Et j'aimerais au final, pouvoir affiché les adresses comme ca par ex :
    http://www.domaine.com
    http://www.domaine.com/page.php?aaa=eee&bbbb=ffff
    http://www.aaaa.com/index.php


    Merci ++[/quote]

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    moi j'utilise cette petite fonction qui a l'air de bien marcher.. mais je ne suis pas un grand pro des expressions regulieres.. donc sans garantie ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function get_urls($string, $strict=true) {
     
       $types = array("href", "src", "url");
       while(list(,$type) = each($types)) {
           $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?';
           preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches);
           $ret[$type] = $matches[2];
       }
     
    	return $ret;
    }
    et ta variable $ret, contient un tableau avec toutes tes urls trouvées dans les attributs href, src et url.. bien sympa !

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    oki tu pourrais donner un exemple entier, concret zevince stp... pour voir comment l'utiliser...

    Merci

    ++

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Je peux te propose ca:
    $js = preg_match_all("(http://)(([a-zA-Z0-9_-]+)([\/]+)\.(php[\?]?))([a-zA-Z0-9_-&=]*)", "\\2\\5'", $texte);
    mais je ne garantie pas la validiter de la regexp

    regarde les exemple de cette fonction : http://fr3.php.net/manual/fr/function.preg-match.php il ya un exemple Lire un nom de domaine dans une URL, qui je pense contient la regexp que tu cherches, a savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^(http:\/\/)?([^\/]+)/i
    Apres a toi de bidouiller pour faire exactement ce que tu cherches.
    Ici les url ayant des parametre seraient recuperer sans les parametres, regarde les liens sur l'article de wikipedia un des sites explique assez bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    // repérer le nom de l'hôte dans l'URL
    preg_match("/^(http:\/\/)?([^\/]+)/i",
       "http://www.php.net/index.html", $matches);
    $host = $matches[2];
    ?>
    voila, bon courage.

  11. #11
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Voila, j'ai essayé en mettant que le début commence par href=' et la fin par ' mais ca ne marche pas, quelqu'un pourrait me dire pourquoi svp ?

    Merci
    ++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $string = "<a href='http://www.aaaa.com'>exemple : </a>";
    if (eregi("^(href=')(')$", $string)) {
        echo "'$string' contient bien une adresse!";
    }

  12. #12
    Membre éclairé Avatar de Yobs
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    675
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 675
    Points : 846
    Points
    846
    Par défaut
    Ton texte est-il en html ou c'est un texte basique? Si html, zevince t'a donné la réponse car en fait il ne suffit que de récupérer l'adresse comprise dans le href de la balise <a>.
    Chaque problème a une solution, mais il est plus facile de répondre si le problème est correctement renseignés

  13. #13
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    moi je ferais ça côté client

    j'ouvre la page html en php et j'y colle au passage un js qui fait la chose

    pour cela js te donne getElementsByTagName qui te retourne un table de XMLNodes

    pour chaque noeud de la table tu récupère son attribut hef s'il existe tu y ajoute un attribut target

    c'est extrêment simple


    tu peux aussi faire ça côté php avec le DOM si tu est sur que html de la page est conforme.

    A+JYT

  14. #14
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Slt

    En fait c'est du texte basique, par exemple, voici ce que j'ai essayé, ca marche toujours pas :


    Code : 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
     
    <?php
    function get_urls($string, $strict=true) { 
     
       $types = array("href", "src", "url"); 
       while(list(,$type) = each($types)) { 
           $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?'; 
           preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches); 
           $ret[$type] = $matches[2]; 
       } 
     
       return $ret; 
    }
     
     
    echo get_urls('<a href="http://www.aaaa.com">exemple : </a>');
    ?>

  15. #15
    Membre éclairé Avatar de Yobs
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    675
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 675
    Points : 846
    Points
    846
    Par défaut
    Normal car sa renvoie un tableau, pour l'afficher:
    Code : 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
    function get_urls($string, $strict=true) { 
     
       $types = array("href", "src", "url"); 
       while(list(,$type) = each($types)) { 
           $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?'; 
           preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches); 
           $ret[$type] = $matches[2]; 
       } 
     
       return $ret; 
    }
     
    $test = get_urls('<a href="http://www.aaaa.com">exemple : </a>'); 
    echo '<pre>'."\n";
    print_r($test);
    echo '</pre>'."\n";
    Chaque problème a une solution, mais il est plus facile de répondre si le problème est correctement renseignés

  16. #16
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    oki merci ca marche, je récupere donc les adresses avec $test[href][0] puis $test[href][1] etc...mais comment faire pour toutes les récupérer sans savoir combien il y en a ? J'ai essayé avec un foreach mais je ne vois pas trop comment faire en fait...

    Merci
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Récupérer tous les liens d'une certaine classe CSS
    Par Lost In Translation dans le forum Langage
    Réponses: 17
    Dernier message: 02/07/2009, 16h54
  2. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  3. Récupérer tous les liens d'une page html
    Par lapras123 dans le forum C
    Réponses: 28
    Dernier message: 08/08/2006, 11h30
  4. [TWebBrowser] Comment trouver tous les liens dans une page ?
    Par xenos dans le forum Composants VCL
    Réponses: 1
    Dernier message: 15/01/2006, 23h36

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