[php] prob regex fin de motif

Fermé
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 - 14 sept. 2010 à 12:05
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 - 14 sept. 2010 à 18:51
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.

8 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
14 sept. 2010 à 12:43
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 jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
14 sept. 2010 à 12:49
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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 sept. 2010 à 13:07
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 jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
14 sept. 2010 à 13:17
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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 sept. 2010 à 13:30
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 jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
14 sept. 2010 à 14:10
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 jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
14 sept. 2010 à 18:04
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 jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
14 sept. 2010 à 18:15
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 jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
14 sept. 2010 à 18:25
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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 sept. 2010 à 18:51
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