begin process at 2012 05 29 01:56:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Débutant(e)

 > 

extracteur de liens - pb de regex


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

extracteur de liens - pb de regex

mercredi 2 mai 2007 à 16:56:18 | extracteur de liens - pb de regex

caviar

    Saluté...
Je bosse sur un système de moteur de recherche en ce moemtnet 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 siut 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

<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
// 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

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'ou le pb... j'aimerai récupérer juste les liens :(

à vot bon coeur !
mercii !
@+
mercredi 2 mai 2007 à 17:41:10 | Re : extracteur de liens - pb de regex

caviar

    au passage j'ai l'impression que le pb vient du fait que ce petit bout de code   (.+?)  accepte les espace et ne devrai pas ...


mercredi 2 mai 2007 à 19:33:39 | Re : extracteur de liens - pb de regex

neigedhiver

Salut, Rendre des URLs cliquables Postée le 20-08-2000 $chaine = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "\\1://\\2\\3",$chaine); Rend cliquable toutes les chaînes du type http://..., ftp://..., mailto://..., etc, contenues dans un texte. Source : http://www.phpinfo.net/page/archives/regex/ Ca devrait t'aider à t'inspirer pour ton expression régulière, non ?
mercredi 2 mai 2007 à 20:01:02 | Re : extracteur de liens - pb de regex

caviar

    saluté.
il me semble que eregi ne fonctionne pas sur la même base des expressions regulière que preg_match_all
en revanche l'expression qie 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 debut)

en gros avec ça on doit pouvoir exreaire tous les liens ... reste à le formaliser ... même ceux contenus dans les javascript ...
je pense que ce qui cloche dans ma regex (le rincipal 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 marhce pas ... j'obtient un gros vide en sortie...

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

mercredi 2 mai 2007 à 22:30:03 | Re : extracteur de liens - pb de regex

audayls

Salut,
Essayes ceci :
<?php
$fp = fopen($_GET['url'], 'r', FALSE);
if ($fp !== FALSE) {
    $temp = '';
    while (!feof($fp)) $temp .= fgets($fp, 4096);
    fclose($fp);

    preg_match_all('`<a.+?href=["\'](.+?)["\'].+?>`sim', $temp, $templink);
   
    $i = -1;
    $link = array();
    while (isset($templink[1][++$i])) {
        if (substr($templink[1][$i], 0, 7) !== 'http://') {
            if (substr($templink[1][$i], 0, 1) === '/') $link[] = $_GET['url'].substr($templink[1][$i], 1);
            else $link[] = $_GET['url'].$templink[1][$i];
        }
        else $link[] = $templink[1][$i];
    }
   
    print_r($link);
}

?>
Perso j'ai essayé avec $_GET['url'] = 'http://www.php.net/'.

For every choice, a consequence (Fable)
jeudi 3 mai 2007 à 00:04:25 | Re : extracteur de liens - pb de regex

caviar

    re salut
j'ai testé avec lemonde.fr et il reste des javascript qui passent à travers ...
puis le script ne gère pas tous les cas de figure ... par ex un lien qui commence par un nom de dossier suivi de slash
ou l'extraction d'une url contenue dans cette balise
<a href="javascript:window.open('./dossier/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>
je pense qu'on peut y arriver avec juste une regex bien pensée ... du moment que la syntaxe du lien est correcte c'est forcément possible de la détecter ...
Je continuerai de chercher demain de toutes façons mais je pense que j'ai besoin d'aide sur ce coup là ;)
j'ai cherché sur le web bien sur mais je n'ai trouvé que des regex basiques ne prenant pas en compte tout les styles de liens expliqués ci avant ...
ya un challenge là :) lol ^^
bon allé faut dormir à un moment donné !
@++ et merci pour ton script en tout cas !
jeudi 3 mai 2007 à 14:18:11 | Re : extracteur de liens - pb de regex

caviar

    yep ...
bon ben j'ai finalement trouvé la regex ultime d'extraction de liens ...

 $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]);
 

@+
jeudi 3 mai 2007 à 18:23:56 | Re : extracteur de liens - pb de regex

neigedhiver

Si je puis me permettre... Le seul handicap de ton expression régulière, c'est qu'elle cherche spécifiquement des pages. Et t'es pas à l'abri qu'un lien soit de la forme : http://www.monsite.com/mapage.bidule Si je dis à mon serveur que les extensions .bidule doivent être interprétés par telle ou telle application (php, jsp, asp, python, shell,...) ton extracteur ne les trouvera pas. Et c'est ballot...
jeudi 3 mai 2007 à 21:15:25 | Re : extracteur de liens - pb de regex

audayls

Woua avec une expression régulière comme çà ton serveur doit bien galerer lol
<?php
$fp = fopen($_GET['url'], 'r', FALSE);
if ($fp !== FALSE) {
    $temp = '';
    while (!feof($fp)) $temp .= fgets($fp, 4096);
    fclose($fp);

    preg_match_all('`<a.+?href=["\'](.+?)["\'].+?>`sim', $temp, $templink);
   
    $i = -1;
    $link = array();
    while (isset($templink[1][++$i])) {
        if (substr($templink[1][$i], 0, 7) === 'http://' OR substr($templink[1][$i], 0, 8) === 'https://') $link[] = $templink[1][$i];
        else{
            $explode = explode('#', $templink[1][$i]);
            $explode = explode('?', $explode[0]);
            $type1 = substr($explode[0], -3);
            $type2 = substr($explode[0], -4);
            if ($type1 === 'asp' OR $type1 === 'htm' OR $type1 === 'php' OR $type2 === 'aspx' OR $type2 === 'xhtml' OR $type2 === 'php3' OR $type2 === 'php4' OR $type2 === 'php5') {
                if (substr($templink[1][$i], 0, 1) === '/') $link[] = $_GET['url'].substr($templink[1][$i], 1);
                elseif (substr($templink[1][$i], 0, 2) === './')  $link[] = $_GET['url'].substr($templink[1][$i], 2);
            }
        }
    }
    print_r($link);
}

?>

For every choice, a consequence (Fable)
jeudi 3 mai 2007 à 21:57:15 | Re : extracteur de liens - pb de regex

neigedhiver

MDR Je suis pas sûr qu'une seule Expression Régulière (surtout une regex posix) soit moins performante qu'une série de 3 à 8 substr() et de je ne sias pas combien d'explode(), sans compter tous les tests et boucles... Je demande à voir... Qui fait un benchmark ?

1 2

Cette discussion est classée dans : fichier, liens, html, regex, array


Répondre à ce message

Sujets en rapport avec ce message

form->php->html [ par BigZoo ] voilà mon pb:j'ai un fichier html en destination avec une structure bien définie et je veux, à partir d'un formulaire dans lequel je mets du texte, de Javascript et PHP [ par RaZoR ] Je voudrais savoir comment on fais pour inclure un fichier .js en php dans une page html (au lieu d'utiliser la fonction html pour inserer un fichier Comment créer un fichier externe avec du code utilisé par plusieur page html ??? [ par GuilleW ] Bonjour ....Pour commencer c'est pas mal qu'il y est du monde qui se bouge pour aider les autes ... (entre autre ... moi dans ce cas !!! <img src=/i probleme conversion HTML -> Texte -> HTML [ par Cho7Kipu ] Coucou tt le monde !Bon alors j'explik mon probleme :J'ai fait un site de partition. Pour que mon moteur puisse rechercher des mots contenu dans une d Je précise ma question: [ par lelougarou ] Bonjour,Pourriez-vous me dire si vous connaisez une méthode pour lire un fichier HTML sur un serveur quelconque, en retenir une partie (de telle ligne executer un script php dans fichier html [ par noyoug ] NoyougJe n'arrive pas à faire executer du code php à l'interieur des balises , rine ne se passe.Par contre si j'appelle directement une source en .php blem tout simple en php [ par pierrolefou ] ben voila j'ai créé un formulaire tout con en html sur une page toute conne en html et je demande d'envoyer mes variables en methode post vers un fich Besoin d'une source ! [ par el_teignou ] Voila, je suis une vrai m*** en php, maos je ne decourage pas.dernierement j'ai eu l'idée d'avoir une signature aléatoire pour mon forum. Mon idée ser bouton 'Action' et '.htm' ou '.php' [ par Tartuffe ] Salut tousse.Je me suis lancé au dév. PhP...Voilà ma question. Dans un fichier '.htm', sur une 'action' j'ai compris comment appeler un '.php'Dans un Include, class et array [ par Hades5k ] Bonjour! J'ai un petit problème à utiliser un array dans un fichier que j'inclus... voici un peu le code : $classNames = array(); include_once('inc/ma


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales