[php] prob regex fin de motif

okuni Messages postés 1325 Statut Membre -  
Alain_42 Messages postés 5413 Statut Membre -
Bonjour,
J'ai un soucis avec une regex, je dois récupérer des chiffres qui se trouvent en fin de motif.

voir l'exemple ici : https://lumadis.be/regex/test_regex.php?id=575

Pour les dernières lignes, il faudrait que la regex prenne tous les chiffres et pas seulement le 1er. (voir la dernière array)

par exemple, pour la ligne 10, j'ai "1" au lieu d'avoir "110"

Comment modifier ma regex ?

Merci d'avance.

--
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

8 réponses

  1. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    Comment modifier ma regex ? Pour modifier il faudrait nous la montrer d'abord ;)
    sinon pour récupérer tous les chiffres en fin de motif :
    [0-9]+$
    
    0
  2. okuni Messages postés 1325 Statut Membre 126
     
    Voir le lien, tous est marqué.
    sinon la voila :
    #>(.+)S: ([0-9]+) - Ep: ([0-9]{1,4})#isU

    et voici le texte :
    > Unnatural History
    S: 1 - Ep: 11
    > Melissa & Joey
    S: 1 - Ep: 4
    > Packed to the Rafters
    S: 3 - Ep: 11
    > Warehouse 13
    S: 2 - Ep: 9
    > Make It or Break It
    S: 2 - Ep: 10
    > White Collar
    S: 2 - Ep: 8
    > Rescue Me
    S: 6 - Ep: 10
    > Covert Affairs
    S: 1 - Ep: 8
    > Louie
    S: 1 - Ep: 11
    > Late Show with David Letterman
    S: 17 - Ep: 190
    > The Tonight Show with Jay Leno
    S: 18 - Ep: 110
    0
  3. Alain_42 Messages postés 5413 Statut Membre 904
     
    inspires toi d'une de ces trois méthodes qui te renvoient un array donc facilement exploitable:

    $chaine='bla blabblallal 09h45-20h30 reblalalalal bla blabblallal 12h20-21h00 reblalalalal';//exemple on veut récupérer l'heure au milieu de tout ça
    $masque="/[0-9]{2}h[0-9]{2}-[0-9]{2}h[0-9]{2}/"; //ou dans ton cas "/EP:[0-9]{1,}/"
    preg_match_all($masque,$chaine,$out1,PREG_PATTERN_ORDER);
    echo 'Avec flag:PREG_PATTERN_ORDER:<br /><pre>';
    print_r($out1);
    echo '</pre>';
    
    preg_match_all($masque,$chaine,$out2,PREG_SET_ORDER);
    echo '<br /><br />Avec flag:PREG_SET_ORDER:<br /><pre>';
    print_r($out2);
    echo '</pre>';
    
    preg_match_all($masque,$chaine,$out3,PREG_OFFSET_CAPTURE);
    echo '<br /><br />Avec flag:PREG_OFFSET_CAPTURE:<br /><pre>';
    print_r($out3);
    echo '</pre>';
    0
    1. okuni Messages postés 1325 Statut Membre 126
       
      J'avais déjà vu ça dans la doc php mais ton exemple ne ressemble pas au mien.
      je reprend la fin de mon exemple :
      > Late Show with David Letterman
      S: 17 - Ep: 190
      > The Tonight Show with Jay Leno
      S: 18 - Ep: 110


      sachant que 110 est la fin de la chaine, comment fait tu pour récupérer tous les nombres (17, 190, 18 et 110)

      Le problème se pose plus sur les 2 nombres à 3 chiffres car il n'y a rien après alors que dans ton exemple, il y a encore des caractères après la fin du motif.
      0
  4. Alain_42 Messages postés 5413 Statut Membre 904
     
    bon ben voilà les trois méthodes qui fonctionnent chez moi:

    <?php
    
     $chaine='Late Show with David Letterman
    S: 17 - Ep: 190';
    
    $masque= "/[0-9]{1,}$/";
    
    //methode 1 
    preg_match_all($masque,$chaine,$out1,PREG_PATTERN_ORDER);
    echo 'Avec flag:PREG_PATTERN_ORDER:<br /><pre>';
    print_r($out1);
    echo '</pre>';
    echo '<br />Soit le chiffre extrait: '.$out1[0][0].'<br /><br />';
    
    //methode 2
    preg_match_all($masque,$chaine,$out2,PREG_SET_ORDER);
    echo '<br /><br />Avec flag:PREG_SET_ORDER:<br /><pre>';
    print_r($out2);
    echo '</pre>';
    echo '<br />Soit le chiffre extrait: '.$out2[0][0].'<br /><br />';
    
    //methode 3
    preg_match_all($masque,$chaine,$out3,PREG_OFFSET_CAPTURE);
    echo '<br /><br />Avec flag:PREG_OFFSET_CAPTURE:<br /><pre>';
    print_r($out3);
    echo '</pre>';
    echo '<br />Soit le chiffre extrait: '.$out3[0][0].'<br /><br />';
    
    ?>
    0
    1. okuni Messages postés 1325 Statut Membre 126
       
      Non ce n'est pas ça, ici tu coupe la chaine.
      essaye avec ceci :
      $chaine = '> Late Show with David Letterman
      S: 17 - Ep: 190
      > The Tonight Show with Jay Leno
      S: 18 - Ep: 110';
      Essaye de récupérer les 4 nombres.

      Sinon, je vais tout simplement utiliser un explode() mais je vais devoir utiliser beaucoup plus de regex.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    Autant pour moi, j'avais mal lu et pas vu le lien que tu avais fourni.
    Petite question sur la structure de l'input, est-ce bien comme ça, 1 sur chaque ligne ( avec donc en fin de ligne un CR LF ? ) ou bien c'est tout a la suite et c'est pour une question de présentation que tu l'as posté comme ça ?
    tu récupères l'input comment ?
    0
  7. okuni Messages postés 1325 Statut Membre 126
     
    qu'est ce qu'un CR LF ?
    Oui la chaine comporte les retour de chariot comme présenté ici.
    0
  8. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    Si la chaine comporte les retour chariot, pourquoi ne pas s'ne aider avec un \r\n dans ta regexp ? Ca aiderai le {1,4} à aller " jusqu'au bout ".
    Du coup
    #>(.+)S: ([0-9]+) - Ep: ([0-9]{1,4})\r\n#isU
    


    Pour info, le CR LF, c'est les 2 caractère de fin de ligne,
    CR : Carriage Return : \r : 13 en décimal
    LF Line Feed 10 en décimal : \n.

    c.f table ascii : http://www.asciitable.com/
    0
  9. Alain_42 Messages postés 5413 Statut Membre 904
     
    non je ne découpe pas la chaine mais prend seulement la fin, fais l'essai tu verras, je pensais que tu lisait les chaines une par une

    un script qui récupéres tous les chiffres dans une chaine plus longue, fais l'essai tu verras que ça les extrait bien !

    $chaine=$chaine = '> Late Show with David Letterman
    S: 17 - Ep: 190
    > The Tonight Show with Jay Leno
    S: 18 - Ep: 110'; 
    
    //$masque="/[0-9]{2}h[0-9]{2}-[0-9]{2}h[0-9]{2}/"; 
    $masque= "/[0-9]{1,}/";
    //methode 1 
    preg_match_all($masque,$chaine,$out1,PREG_PATTERN_ORDER);
    echo 'Avec flag:PREG_PATTERN_ORDER:<br /><pre>';
    print_r($out1);
    echo '</pre>';
    
    echo '<br />les chiffres extraits: <br />';
    //on parcours le deuxième niveau de l'array pour avoir tous les chiffres
    //si on veux en faire le total
    $total=0;
    for($i=0;$i<sizeof($out1[0]);$i++){
            echo 'chiffre n° '.($i+1).' = '.$out1[0][$i].'<br />';
        $total+=$out1[0][$i];
    }
    echo '<br /><br /><b>Et le total est = </b>'.$total;
    
    ?>
    0