8768 sujets

Développement web côté serveur, CMS

Bonjour,
j'ai une expression régulière qui fonctionne seulement lorsqu'il n'y a pas de répétition de données

$xp = "#<tr CLASS='[^']*'>[^<]*<td CLASS='[^']*'>(.*)</td>[^<]*<td CLASS='[^']*'>(.*)</td>[^<]*</tr>#si"
preg_match_all($xp, $data, $matches);


ça marche quand j'ai seulement cette donnée
<tr CLASS='style12'>
<td CLASS='style11'>Data 1</td>
<td CLASS='red'><a href="#">test</a></td>
</tr>


mais pas quand il y en a plusieurs
<tr CLASS='style12'>
<td CLASS='style11'>Data 1</td>
<td CLASS='red'><a href="#">test</a></td>
</tr>
<tr CLASS='style12'>
<td CLASS='style11'>Data 1</td>
<td CLASS='red'><a href="#">test</a></td>
</tr>


même en répétant les mêmes datas

merci d'avance
Bonjour.

Effectivement, votre demande est imprécise !...
On voit bien que vous voulez récupérer ce qui se situe entre les tags <td> et </td>. Néanmoins quand le contenu est un lien, que voulez y extraire très exactement ???...
En supposant que le + important est le lien 'stricto sensu', je vous ai construit une regex fonctionnelle ; et afin de ne pas vous embrouiller j'ai repris exactement l'exemple et les références utilisées...
<?php
     $data  = "<tr CLASS='style12'>" ;
     $data .= "<td CLASS='style11'>Data 1</td>" ;
     $data .= "<td CLASS='red'><a href='#'>test</a></td></tr>" ;
     $data .= "<tr CLASS='style12'>" ; 
     $data .= "<td CLASS='style11'>Data 2</td>" ;
     $data .= "<td CLASS='red'><a href='#'>test</a></td></tr>" ;    

     [b]$xp = "~<td[^>]*>(<a href=['\"])?([^<'\"]*)[<'\"]~" ;[/b]

     preg_match_all($xp, $data, $matches) ;
    
     echo "<pre>" ;
     print_r($matches[2]) ;
     echo "</pre>" ;
?>  
Vous pouvez tester, cela fonctionne !... Vous récupérez dans un array alternativement, le libellé du poste et le lien correspondant...
Attention également : La regex serait à compléter, en supposant l'éventuelle présence d'attribut dans le lien, et ce avant 'href'...

Cdlt
Modifié par ht1cd (12 Aug 2015 - 12:25)