Page 1 sur 1

REGEX [Récupérer des données HTML]

Posté : 19 janv. 2024, 01:26
par Mehdi06089
Bonsoir,

J'ai une petite demande, je dois réaliser un projet de récupération de tirages, cependant tout va bien jusqu'au moment ou je dois récupérer les données des tirages avec seulement un tableau comme suit :

<?php
$html = '
<td class="column1 style0 s">17/01/2024</td>
<td class="column2 style0 s">soir</td>
<td class="column4 style0 n">2</td>
<td class="column5 style0 n">3</td>
<td class="column6 style0 n">7</td>
<td class="column7 style0 n">13</td>
<td class="column8 style0 n">19</td>
<td class="column9 style0 n">20</td>
<td class="column10 style0 n">24</td>
<td class="column11 style0 n">25</td>
<td class="column12 style0 n">26</td>
<td class="column13 style0 n">31</td>
<td class="column14 style0 n">39</td>
<td class="column15 style0 n">40</td>
<td class="column16 style0 n">42</td>
<td class="column17 style0 n">45</td>
<td class="column18 style0 n">46</td>
<td class="column19 style0 n">50</td>
<td class="column20 style0 n">54</td>
<td class="column21 style0 n">55</td>
<td class="column22 style0 n">57</td>
<td class="column23 style0 n">67</td>
<td class="column24 style0 n">3</td>';
preg_match('/<td class="column2 style0 s">(.*?)<\/td>/s', $html, $match);
echo 'TIRAGE : ['.strtoupper($match[1]).'] : ';
preg_match('/<td class="column1 style0 s">(.*?)<\/td>/s', $html, $match);
echo $match[1];
echo "<br><br>";
for($i=4;$i<=23;$i++)
{
preg_match('/<td class="column'.$i.' style0 n">(.*?)<\/td>/s', $html, $match);
echo $match[1]."<br>";
}
?>

Jusque là tout va bien, il s'affiche ceci :
TIRAGE : [SOIR] : 17/01/2024

2
3
7
13
19
20
24
25
26
31
39
40
42
45
46
50
54
55
57
67
J'ai moi cependant une page HTML de ce genre :
<tr class="row1">
<td class="column1 style0 s">17/01/2024</td>
<td class="column2 style0 s">soir</td>
<td class="column4 style0 n">2</td>
<td class="column5 style0 n">3</td>
<td class="column6 style0 n">7</td>
<td class="column7 style0 n">13</td>
<td class="column8 style0 n">19</td>
<td class="column9 style0 n">20</td>
<td class="column10 style0 n">24</td>
<td class="column11 style0 n">25</td>
<td class="column12 style0 n">26</td>
<td class="column13 style0 n">31</td>
<td class="column14 style0 n">39</td>
<td class="column15 style0 n">40</td>
<td class="column16 style0 n">42</td>
<td class="column17 style0 n">45</td>
<td class="column18 style0 n">46</td>
<td class="column19 style0 n">50</td>
<td class="column20 style0 n">54</td>
<td class="column21 style0 n">55</td>
<td class="column22 style0 n">57</td>
<td class="column23 style0 n">67</td>
<td class="column24 style0 n">3</td>
</tr>
<tr class="row2">
<td class="column1 style0 s">17/01/2024</td>
<td class="column2 style0 s">midi</td>
<td class="column4 style0 n">5</td>
<td class="column5 style0 n">6</td>
<td class="column6 style0 n">15</td>
<td class="column7 style0 n">18</td>
<td class="column8 style0 n">19</td>
<td class="column9 style0 n">21</td>
<td class="column10 style0 n">26</td>
<td class="column11 style0 n">36</td>
<td class="column12 style0 n">37</td>
<td class="column13 style0 n">38</td>
<td class="column14 style0 n">39</td>
<td class="column15 style0 n">42</td>
<td class="column16 style0 n">44</td>
<td class="column17 style0 n">45</td>
<td class="column18 style0 n">46</td>
<td class="column19 style0 n">54</td>
<td class="column20 style0 n">56</td>
<td class="column21 style0 n">63</td>
<td class="column22 style0 n">67</td>
<td class="column23 style0 n">68</td>
<td class="column24 style0 n">2</td></tr>
J'ai essayer cela mais cela ne fonctionne pas ...

<?php
$html = '<tr class="row1">
<td class="column1 style0 s">17/01/2024</td>
<td class="column2 style0 s">soir</td>
<td class="column4 style0 n">2</td>
<td class="column5 style0 n">3</td>
<td class="column6 style0 n">7</td>
<td class="column7 style0 n">13</td>
<td class="column8 style0 n">19</td>
<td class="column9 style0 n">20</td>
<td class="column10 style0 n">24</td>
<td class="column11 style0 n">25</td>
<td class="column12 style0 n">26</td>
<td class="column13 style0 n">31</td>
<td class="column14 style0 n">39</td>
<td class="column15 style0 n">40</td>
<td class="column16 style0 n">42</td>
<td class="column17 style0 n">45</td>
<td class="column18 style0 n">46</td>
<td class="column19 style0 n">50</td>
<td class="column20 style0 n">54</td>
<td class="column21 style0 n">55</td>
<td class="column22 style0 n">57</td>
<td class="column23 style0 n">67</td>
<td class="column24 style0 n">3</td>
</tr>
<tr class="row2">
<td class="column1 style0 s">17/01/2024</td>
<td class="column2 style0 s">midi</td>
<td class="column4 style0 n">5</td>
<td class="column5 style0 n">6</td>
<td class="column6 style0 n">15</td>
<td class="column7 style0 n">18</td>
<td class="column8 style0 n">19</td>
<td class="column9 style0 n">21</td>
<td class="column10 style0 n">26</td>
<td class="column11 style0 n">36</td>
<td class="column12 style0 n">37</td>
<td class="column13 style0 n">38</td>
<td class="column14 style0 n">39</td>
<td class="column15 style0 n">42</td>
<td class="column16 style0 n">44</td>
<td class="column17 style0 n">45</td>
<td class="column18 style0 n">46</td>
<td class="column19 style0 n">54</td>
<td class="column20 style0 n">56</td>
<td class="column21 style0 n">63</td>
<td class="column22 style0 n">67</td>
<td class="column23 style0 n">68</td>
<td class="column24 style0 n">2</td></tr>';
for($b=1;$b<=2;$b++)
{
preg_match('/<tr class="row'.$b.'"><td class="column2 style0 s">(.*?)<\/td><\/tr>/s', $html, $match);
echo 'TIRAGE : ['.strtoupper($match[0]).'] : ';
preg_match('/<td class="column1 style0 s">(.*?)<\/td>/s', $html, $match);
echo $match[1];
echo "<br>";
for($i=4;$i<=23;$i++)
{
preg_match('/<td class="column'.$i.' style0 n">(.*?)<\/td>/s', $html, $match);
echo $match[1].",<br>";
}
}
?>

Je m'excuse du désastre, ce code n'est certainement pas professionnel, mais j'aimerais comprendre.
J'aimerais donc la bonne REGEX svp qui pourrait aussi extraire la balise <tr>, que je puisse faire la bonne boucle pour extraire les 2 tirages correctement.

Merci.

Re: REGEX [Récupérer des données HTML]

Posté : 19 janv. 2024, 01:54
par Spols
pour extraire du html, utilise plutot simpleXML, ce sera plus durable et plus simple que les REGEX

Sinon tu devrais inclure ta column1 dans ta REGEX car elle se trouve entre ton TR et ton column2

preg_match('/<tr class="row'.$b.'">
<td class="column1 style0 s">.*?<\/td>
<td class="column2 style0 s">(.*?)<\/td>', $html, $match);

Pas sur mais à essayer, En plus tu peux capturer la date et le timing de ton tirage d'un coup

Re: REGEX [Récupérer des données HTML]

Posté : 19 janv. 2024, 02:12
par Mehdi06089
Merci.
Mais avez-vous le bonne exemple pour mon cas, que j'apprenne mieux les choses.
J'ai finalement convertit mon fichier en XML, ce qui va aller beaucoup mieux, si vous avez quand même l'exemple avec la fonction simpleXML(); en PHP, pour un fichier XML dans mon cas, cela pourrait avancer un peu les choses quand même, bien que j'ai regarder la fonction et que cela parait nettement plus simple qu'avec un fichier HTML et les REGEX.

Re: REGEX [Récupérer des données HTML]

Posté : 19 janv. 2024, 12:33
par Spols
L'idée est de charger le html avec
$xml = new simpleXMLElement($html); mais pour s'assurer d'avoir un XML valid, il vaut mieux inclure manuellement la première balise
$xml = new simpleXMLElement('<xml>' . $html . '</xml>');

ensuite tu parcours les balise tr avec un foreach dans lequel tu parcours les balises td
foreach($xml->tr as $tr) {
foreach($tr as $td) {

Tu récupère l'attribut class de ton td et tu vois quelle "columnx" tu a.
$class = explode(' ', $td->attributes()['class']);
j'ai mis un explode pour obtenir un tableau et ainsi vérifier la présence de la class recherchée avec in_array()
En fonction de cela tu en garde la date, le timing et les tirages. un peu de mise en forme de tout cela et tu obtiendra ce qu'il te faut