Problème de regex

Problème de regex - PHP - Programmation

Marsh Posté le 10-01-2006 à 17:42:53    

Bonjour,
 
je suis débutant en php, et j'ai monté un petit script qui récupère des infos dans les posts d'un sujet sur mon forum.
J'ai fait en sorte que seulement les chiffres soient conservés (c'est pour un lotofoot automatisé)
 
pour l'instant ce bout de code fonctionne pas mal :
 

Code :
  1. $prono1=ereg_replace("[[:space:]]","",$prono);
  2. $prono=ereg_replace("[a-zA-Z\-\=/</>/!/-/''/-]","",$prono1);


 
mais de temps en temps des ; ou des $ restent néanmoins dans les données que je rapatrie.
 
Mon code doit être bien crado  :sweat: mais il a pour l'instant le mérite de marcher dans 95% des cas.
quelqu'un aurait-il une idée pour un ereg_replace qui conserve juste les chiffres, sans espaces, ni rien d'autre ?
 
merci d'avance !


Message édité par zoran le 10-01-2006 à 17:44:38
Reply

Marsh Posté le 10-01-2006 à 17:42:53   

Reply

Marsh Posté le 10-01-2006 à 17:51:09    

je sais plus si c'est avec ereg_replace ou avec reg_replace, mais pour l'un des deux,

Code :
  1. [^[:num:]].*

permet de dire : tout ce qui n'est pas un chiffre.

Reply

Marsh Posté le 10-01-2006 à 17:51:40    

- utilise preg_replace c'est plus rapide
- pourquoi tu ne supprimes pas tout simplement tous les caractères qui ne sont pas des chiffres ? je te laisse traduire en regexp
 
edit: grilled  :whistle:


Message édité par soju le 10-01-2006 à 17:52:06
Reply

Marsh Posté le 10-01-2006 à 17:55:46    

omega2 a écrit :

je sais plus si c'est avec ereg_replace ou avec reg_replace, mais pour l'un des deux,

Code :
  1. [^[:num:]].*

permet de dire : tout ce qui n'est pas un chiffre.


C'est pour ereg
 
Avec un preg je mettrais plutot \D (qui est le contraire de \d qui veut dire n'importe quel chiffre)

Reply

Marsh Posté le 10-01-2006 à 19:36:44    

avec  

Code :
  1. $prono1=preg_replace("[^0-9]","",$prono);


 
le script ne marche pas
 
et si je tente avec avec reg_replace et [^[:num:]].* j'ai un Reg_ectype  
 
c'est dur les regex  :sweat:

Reply

Marsh Posté le 10-01-2006 à 19:43:57    

Donne nous une chaine de caracteres type que tu seras amené a traiter par ton script et precise quels champs tu souhaites recuperer.

Reply

Marsh Posté le 10-01-2006 à 19:47:49    

je récupère le code html d'un post en fait donc de type :

Code :
  1. <!--c1--><div class="codetop">CODE</div><div class="codemain"><!--ec1-->Bordeaux 1-0 Auxerre<br>Lens 3-1 Nancy<br>Sochaux 0-0 Nice<br>Troyes 0-1 Lille<br>Rennes 2-1 Le Mans<br>AC Ajaccio 0-0 Nantes<br>Monaco 2-0 Strasbourg<br>Metz 0-0 Saint-Etienne<br>Lyon 2-0 Marseille<br>Toulouse 1-1 PSG<br><!--c2--></div><!--ec2--><br><br>


 
les bbcode doivent peut être pas arranger la chose mais j'ai pas vraiment le choix :/
et je souhaite récupérer les différentes scores sous la forme de 20 chiffres colés type :

Code :
  1. 20110020112021113120


Message édité par zoran le 10-01-2006 à 19:48:55
Reply

Marsh Posté le 10-01-2006 à 19:52:49    

$foo = preg_replace('#[^0-9]#', '', $foo);
 
Ne pas oublier le caractère spécial en début/fin de masque. :spamafote:


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 10-01-2006 à 19:58:19    

$text = '<!--c1--><div class="codet ... SG<br><!--c2--></div><!--ec2--><br><br>';
 
preg_match_all('#([a-z]+) ([0-9]+)-([0-9]+) ([a-z]+)#i' , $text , $result);
 
count($result[0]) -> donne le nombre de resultats (n resultats)
 
$result[1][0] -> Bordeaux
$result[1][1] -> 1
$result[1][2] -> 0
$result[1][3] -> Auxerre
 
$result[2] etc $result[n-1] ... te donnent les resultats suivants.

Reply

Marsh Posté le 10-01-2006 à 20:00:37    

sielfried a écrit :

$foo = preg_replace('#[^0-9]#', '', $foo);
 
Ne pas oublier le caractère spécial en début/fin de masque. :spamafote:


 
ca me donne ca malheureusement  

Code :
  1. --c1-->


 

afbilou a écrit :

$text = '<!--c1--><div class="codet ... SG<br><!--c2--></div><!--ec2--><br><br>';
 
preg_match_all('#([a-z]+) ([0-9]+)-([0-9]+) ([a-z]+)#i' , $text , $result);
 
count($result[0]) -> donne le nombre de resultats (n resultats)
 
$result[1][0] -> Bordeaux
$result[1][1] -> 1
$result[1][2] -> 0
$result[1][3] -> Auxerre
 
$result[2] etc $result[n-1] ... te donnent les resultats suivants.


 
je vais essayer avec ça merci  :jap:  

Reply

Marsh Posté le 10-01-2006 à 20:00:37   

Reply

Marsh Posté le 10-01-2006 à 20:07:02    

zoran a écrit :

ca me donne ca malheureusement  

Code :
  1. --c1-->




 

Code :
  1. $foo = '<!--c1--><div class="codetop">CODE</div><div class="codemain"><!--ec1-->Bordeaux 1-0 Auxerre<br>Lens 3-1 Nancy<br>Sochaux 0-0 Nice<br>Troyes 0-1 Lille<br>Rennes 2-1 Le Mans<br>AC Ajaccio 0-0 Nantes<br>Monaco 2-0 Strasbourg<br>Metz 0-0 Saint-Etienne<br>Lyon 2-0 Marseille<br>Toulouse 1-1 PSG<br><!--c2--></div><!--ec2--><br><br>';
  2. echo preg_replace('#[^0-9]#', '', $foo);


 
affiche 111031000121002000201122 chez moi. Y'a juste quelques chiffres qui traînent devant et derrière, donc faut d'abord preg_matcher ce qu'il faut.


Message édité par sielfried le 10-01-2006 à 20:09:01

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 10-01-2006 à 20:09:01    

la solution de sielfried ne fonctionne que si l'ensemble de ton document ne contient aucun autre chiffre que ceux des resultats sportifs. Il faudrait donc effectuer un prétraitement (a bas de regex par exemple) pour ne recuperer que ce qui se trouve entre <div class="codemain"> et </div>
 
un preg_match avec '#<div class="codemain">.*</div>#U'
puis le preg_replace qu'il suggere '[^0-9]' -> ''

Reply

Marsh Posté le 10-01-2006 à 20:09:40    

Reply

Marsh Posté le 10-01-2006 à 20:13:23    

mais une fois ta chaine numérique recupérée tu vas faire un traitement dessus je suppose ? ca me parraissait plus judicieux de recuperer les données completes et separées comme il faut dans un tableau (le $result que j'utilise) c'est pourquoi je proposais cette solution.

Reply

Marsh Posté le 10-01-2006 à 20:18:29    

avec un :
 

Code :
  1. $prono1=preg_replace('#[^0-9]#', '', $prono);
  2. $prono=substr($prono1,2,20);


 
ca me donne bien les résultats que je veux  
 
merci sielfried, afbilou et les autres  :jap:  
 
c'est vrai que je la traite après la chaine, mais disons que j'ai déjà codé cette partie là et ca fonctionne.
mais je reprendrai tout avec ta solution histoire d'alléger le code, c'est vrai que ca sera plus simple

Reply

Marsh Posté le 10-01-2006 à 20:20:49    

quitte a faire un substr ... tu devrais le faire AVANT la regex ... c toujours ca de gagné :p


Message édité par afbilou le 10-01-2006 à 20:20:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed