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 :

Syntaxe qui ne renvoie aucun résultat [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut Syntaxe qui ne renvoie aucun résultat
    Bonjour,
    Je veux récupérer le tableau du classement de mon équipe de basket sur le site de la fédération mais suite à une refonte de celui-ci, ma regex ne fonctionne plus.
    Pourriez-vous me dépanner ?

    Voici une version simplifiée:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function extract_ranking_from_FFBB() // Création de la fonction permettant d'afficher le classement et le calendrier d'une page FFBB
    {	
    	$url_code = "b5e6211de522b5e6211e678d"
    	$page = file_get_contents('http://resultats.ffbb.com/championnat/classements/'.$url_code.'.html'); //Chargement du contenu de la page FFBB dans une variable
     
    	//Recherche des lignes de tableau de classement au sein de la page
    preg_match_all('#(<tr class="(altern-2|no-altern-2)">\s*<td class="gauche" align="center">\s*[0-9]+\s*</td>\s*<td align="left">\s*<a class="tableau" target="_parent" href=".*">[a-zA-Z0-9_/() \'-éè]*</a>\s*</td>\s*(<td align="center">[0-9]*\.?[0-9]*</td>\s*){15}\s*</tr>)#isU',$page,$lignesclassement);
     
     
    	//Ensuite on reconstitue le tableau avec la mise en forme du site du club
    	echo '<h1>Classement officiel FFBB</h1><br>';
     
    	//D'abord l'en-tête
    	echo '<div style="text-align: center;">
    		<table class="tableauFFBB">
    			<tr class="table_title">
    				<td rowspan=2 align="center">Pos.</td>
    				<td NOWRAP rowspan=2>Equipe</td>
    				<td rowspan=2>Pts</td>
    				<td align=center colspan=4>Rencontres</td>
    				<td rowspan=2 align="center">Pén.</td>
    				<td rowspan=2 align="center">Forf.</td>
    				<td rowspan=2 align="center">Déf.</td>
    				<td align=center colspan=2>Pénalités</td>
    				<td align=center colspan=3>Points</td>
    			</tr>
    			<tr class="table_title">
    				<td align="center">J</td>
    				<td align="center">G</td>
    				<td align="center">P</td>
    				<td align="center">N</td>
    				<td align="center">Arb</td>
    				<td align="center">Ent</td>
    				<td align="center">M</td>
    				<td align="center">E</td>
    				<td align="center">Q</td>
    			</tr>';
     
    	//Puis les lignes extraites grâce à la REGEX
    			$balises_classement_a_remplacer = array('#<a href=".*" class="(tableau)">#isU','#</a>#isU'); //on fait le ménage des liens html
    			$balises_classement_remplacees = array('','');
     
    			foreach ($lignesclassement[1] as $ligneclassement) {
    				echo preg_replace($balises_classement_a_remplacer,$balises_classement_remplacees, $ligneclassement);
    			}
     
    	echo '</table></div>';
    }
    J'ai fait plusieurs tests et je constate que si j'utilise l'expression suivante, je capte bien les 10 lignes qui constituent le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#(<tr class="(altern-2|no-altern-2)">\s*<td )#isU',$page,$lignesclassement);
    Par contre avec l'expression ci-dessous, rien ne sort.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#(<tr class="(altern-2|no-altern-2)">\s*<td class="gauche" align="center">)#isU',$page,$lignesclassement);

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    en regardant le code de la page
    http://resultats.ffbb.com/championna...6211e678d.html

    on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td align="center" class="gauche">

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Bon sang !
    Tu viens de me faire me rendre compte que Firebug ne me renvoie pas exactement le code source mais le réorganise...

    Merci beaucoup !

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    C'est pas une super bonne idée d'utiliser des regex pour extraire des informations du html, comme tu peux le voir, il suffit d'un petit changement dans le code pour que ta pattern ne trouve plus rien. Utiliser DOMDocument ne rendras pas ton code indifférent aux changements futurs de la page source, mais par contre il sera bien plus résistant aux petites modifications comme des changements dans l'ordre des attributs. Et si les changements sont plus importants, ce sera plus simple à éditer:
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .tableauFFBB { text-align:center; }
    td:nth-child(2), tr:first-child>th:nth-child(2) { text-align: left; }
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <table class="tableauFFBB">
        <caption>Classement officiel FFBB</caption>
        <thead>
            <tr>
                <th rowspan="2">Pos.</th>
                <th rowspan="2">Equipe</th>
                <th rowspan="2">Pts</th>
                <th colspan="4">Rencontres</th>
                <th rowspan="2">Init.</th>
                <th rowspan="2">Pén.</th>
                <th rowspan="2">Forf.</th>
                <th rowspan="2">Déf.</th>
                <th colspan="2">Pénalités</th>
                <th colspan="3">Points</th>
            </tr>
            <tr><th>J</th><th>G</th><th>P</th><th>N</th><th>Arb</th><th>Ent</th><th>M</th><th>E</th><th>Q</th></tr>
        </thead>
        <tbody><?php
     
    $idClub = 'b5e6211de522b5e6211e678d';
    $url = 'http://resultats.ffbb.com/championnat/classements/' . $idClub . '.html';
     
    $dom = new DOMDocument();
    @$dom->loadHTMLFile($url);
     
    $xpath = new DOMXPath($dom);
    $trNodeList = $xpath->query('//tr[contains(@class, "altern-2")]'); // liste des nœuds tr dont l'attribut class contient "altern-2"
     
    foreach($trNodeList as $trNode) {
        echo "<tr>\n";
        foreach ($trNode->getElementsByTagName('td') as $k => $tdNode) {
            if ($k !== 13)  // on saute la case vide dans la source
                echo "<td>" . $tdNode->nodeValue . "</td>\n";
        }
        echo "</tr>\n";
    }
    	?>
        </tbody>
    </table>
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    @CosmoKnacki: Merci pour le conseil. Ça pourrait me faciliter la vie. Je creuserai lorsque j'aurai plus de temps.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/06/2010, 15h50
  2. [CakePHP] [I18n] Find ne renvoi aucun résultat
    Par BoZ-FlYos dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 07/04/2010, 13h49
  3. [MySQL] Une requete qui ne retourne aucun résultats
    Par amerex dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/01/2010, 17h46
  4. Code de calcul qui ne renvoie aucun résultat
    Par joniyyy dans le forum Langage
    Réponses: 9
    Dernier message: 04/10/2008, 19h33

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