[php] prob regex fin de motif

okuni Messages postés 1221 Date d'inscription   Statut Membre Dernière intervention   -  
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   -
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.
A voir également:

8 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription   Statut Membre Dernière intervention   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
okuni Messages postés 1221 Date d'inscription   Statut Membre Dernière intervention   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
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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
okuni Messages postés 1221 Date d'inscription   Statut Membre Dernière intervention   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
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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
okuni Messages postés 1221 Date d'inscription   Statut Membre Dernière intervention   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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zep3k!GnO Messages postés 2025 Date d'inscription   Statut Membre Dernière intervention   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
okuni Messages postés 1221 Date d'inscription   Statut Membre Dernière intervention   126
 
qu'est ce qu'un CR LF ?
Oui la chaine comporte les retour de chariot comme présenté ici.
0
Zep3k!GnO Messages postés 2025 Date d'inscription   Statut Membre Dernière intervention   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
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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