multi-regex

multi-regex - PHP - Programmation

Marsh Posté le 16-04-2006 à 13:06:24    

Bonjour,  
 
J'ai écrit une fonction, transformant le string "ida [suivi de 1 à 4 chiffres]" en un hyperlien. La voici :
 

Code :
  1. function change($in){
  2. preg_match_all ("/ida [0-9]+/", $in, $c);
  3. foreach($c as $d){
  4. $seq = "$d[0]";
  5. }
  6. $lien = ereg_replace(' ', '=', $seq);
  7. $out = preg_replace ("/ida [0-9]+/",
  8.        "<a class=\"mess\" href=\"http://localhost/~thiebo/test/ficheacte.php?$lien\">$seq</a>",
  9.        $in);
  10. return $out;
  11. }


 
et voici l'utilisation :
 

Code :
  1. $phrase = "Acte numero 456 de 1254, ida 109 que tu trouveras dans la base aussi !";
  2. echo "<p>".$phrase."</p>";
  3. $modif = change($phrase);
  4. echo "<p>".$modif."</p>";


 
et ça marche. Seulement... Si $phrase contient 2 ou plusieurs fois le string "ida [suite de chiffres]", ça ne marche plus car toutes les string renvoyent alors au même url...
 
Par exemple :
 

Code :
  1. $phrase = "Acte numero 456 de 1254, ida 109  et acte n° 658 de 1296, ida 1102 ";


 
le résultat de cela sera deux fois :
 
http://localhost/~thiebo/test/ficheacte.php?ida=109 alors que la deuxième fois ça devrait être fichacte.php?ida=1102
 
Comment faire pour que le bon ida renvoit au bon url ????
 
Merci de vos idées !
 

Reply

Marsh Posté le 16-04-2006 à 13:06:24   

Reply

Marsh Posté le 16-04-2006 à 20:15:43    

Pourquoi ne pas faire un truc du genre :
 

Code :
  1. function change($in){
  2.     $out = preg_replace ("/ida ([0-9]+)/",
  3.             "<a class=\"mess\" href=\"http://localhost/~thiebo/test/ficheacte.php?ida=$1\">$1</a>",
  4.             $in);
  5.     return $out;
  6. }


 
?
 
Il sert à quoi le preg_match_all dans ce cas là ?


Message édité par FlorentP le 16-04-2006 à 20:16:08
Reply

Marsh Posté le 17-04-2006 à 13:25:50    

Salut, merci pour ta réponse.  
 
Le preg_match_all sert à extraire le string "ida(+chiffres=)" pour ensuite en faire deux : l'un qui reste ida 999 (par exemple) et l'autre que je transforme en ida=999.  
 
en effet ta fonction fait exactement ce que je cherchais à faire. J'ai simplement copié et collé et ça marche. Seulement, je ne vois pas pourquoi ça ne marche pas. C'est quoi au juste le $1  ?  
 
Merci encore,
 

Reply

Marsh Posté le 17-04-2006 à 13:51:16    

Ca ne marchais pas surement à cause de :
 
foreach($c as $d){
    $seq = "$d[0]";
}
 
=> $seq était écrasé à chaque fois
 
Sinon, le $1 c'est la chaine de caractère qu'il récupère avec ce qu'il y a entre parenthèse dans ta regex : ([0-9+) => $1 contiendra le nombre repéré

Reply

Marsh Posté le 17-04-2006 à 16:05:32    

tu as tout à fait raison, $seq se voyait assigner une valeur fixe. Je le savais - je ne savais pas qu'il y avait des phrases avec 2 fois ida quelque chose.  
 
Merci pour l'explication. Joyeuse paque !
 
Ciao

Reply

Sujets relatifs:

Leave a Replay

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