[Resolu] Regex : Variable et incrementation dans le replace

Regex : Variable et incrementation dans le replace [Resolu] - PHP - Programmation

Marsh Posté le 01-10-2011 à 14:30:30    

Bonjour tout le monde !
 
je planche sur un petit problème depuis hier soir, je m'explique : avec ma regex, je cherche a conserver uniquement les caractères se trouvant entre 2 parenthèse, et les utiliser dans une requêtes sql. Jusque la aucun problème, la ou ça se complique c'est au remplacement. En effet, j'aimerais qu'a la suite des caractères entre parenthèses se "greffe" une variable qui s’incrémente après chaque affichage de caractère entre parenthèse.
 
Concrètement :
 

Code :
  1. <?php
  2. $compteur=1;
  3. $texte='La Fluctuation de l’ouvre-boîte électrique (The Electric Can Opener Fluctuation)
  4.     Le Grillon des champs (The Jiminy Conjecture)
  5.     La Déviation Gothowitz (The Gothowitz Deviation)
  6.     La Solution pirate (The Pirate Solution)
  7.     Le Tournoi de cartes (The Creepy Candy Coating Corollary)';
  8. $texte = preg_replace('#(.+)\((.+)\)#', 'UPDATE `bdd`.`serie` SET `titre_episode` = \'$2\' WHERE `serie`.`id` ='.$compteur++.';<br />', $texte);
  9. echo($texte);
  10. ?>


 
le problème c'est que je n'ai pas d’incrémentation... le résultat est celui ci :
 

Code :
  1. UPDATE `bdd`.`serie` SET `titre_episode` = 'The Electric Can Opener Fluctuation' WHERE `serie`.`id` =1;
  2. UPDATE `bdd`.`serie` SET `titre_episode` = 'The Jiminy Conjecture' WHERE `serie`.`id` =1;
  3. UPDATE `bdd`.`serie` SET `titre_episode` = 'The Gothowitz Deviation' WHERE `serie`.`id` =1;
  4. UPDATE `bdd`.`serie` SET `titre_episode` = 'The Pirate Solution' WHERE `serie`.`id` =1;
  5. UPDATE `bdd`.`serie` SET `titre_episode` = 'The Creepy Candy Coating Corollary' WHERE `serie`.`id` =1;


 
J'ai essayé beaucoup de truc comme mettre ma variable dans la chaine de caractère, et ça marche, mais le but de ce script est de pouvoir traiter des données massivement ce qui n'est pas possible si je dois copier/coller ma variable moi même à chaque ligne. La chaine de caractère vient de wikipedia, ce sont les titres des épisodes de la serie the big bang theory dans cet exemple. J'aimerais pouvoir traiter des centaines de lignes d'un coup de cette manière.
En gros c'est un script de fainéant  :sleep: mais bon en même temps vla le boulot si je fais pas ça.
Je vous remercie d'avance pou vos lumières.
 
EDIT : J'ai trouvé ma solution, je travaille dessus et je poste le résultat.
 
Bon j'ai trouvé ma solution, j'ai utilisé la boucle foreach que je ne connaissais pas. Maintenant je galère avec mon expression régulière  :fou: .
 
Voila donc ce que ca donne maintenant :
 

Code :
  1. <?php
  2. $texte="Première saison (2005-2006)[modifier]
  3. Article détaillé : Saison 1 de How I Met Your Mother.
  4.     Un signe (Pilot)
  5.     Je te présente Ted (Purple Giraffe)
  6.     Un goût de liberté (Sweet Taste of Liberty)
  7.     Retour de flamme (Return of the Shirt)
  8.     La Soirée dégustation (Okay Awesome)";
  9. $texte = addslashes($texte);
  10. preg_match_all('#(.+)\((.+)\)#',$texte,$out, PREG_PATTERN_ORDER);
  11. $id_depart=115;
  12. foreach($out[2] as $line)
  13. {
  14. echo 'UPDATE `bdd`.`serie` SET `titre_episode` = \'';
  15. echo $line;
  16. echo '\' WHERE `serie`.`id` =';
  17. echo $id_depart;
  18. echo ';<br />';
  19. $id_depart++;
  20. }
  21. ?>


 
avec mon expression régulière, la boucle affiche "(2005-2006)"
 
ça fait bientôt 1h que je cherche mais j'y arrive pas :s.
Je pensais qu'avec ça ça marcherait mais non :

Code :
  1. #(.+)\((^[^0-9][^0-9]+[^-][^0-9]+)\)#


 
j'ai essayé plein de truc mais au final ça m'affiche plus rien.
je vous remercie d'avance.


Message édité par spaik21 le 03-10-2011 à 22:38:15
Reply

Marsh Posté le 01-10-2011 à 14:30:30   

Reply

Marsh Posté le 02-10-2011 à 07:10:45    

Tu as besoin d'une fonction de callback.
 
Il te faut donc utiliser preg_replace_callback()
http://php.net/manual/en/function. [...] llback.php


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 02-10-2011 à 18:28:37    

Tout d'abord merci pour la réponse, ensuite je m'excuse mais je ne comprend pas pourquoi je dois utiliser cette fonction. Cela revient au même non ? au final de toute manière mon expression régulière n'est pas bonne il faut que je vire de mes résultats toutes parenthèses avec (année-année). Je n'ai pas encore eu le temps de chercher plus, je m'y mettrais ce soir.

Reply

Marsh Posté le 03-10-2011 à 13:25:39    

Je répondais juste à la problématique du preg_replace avec un remplacement dynamique, pour que la prochaine fois tu ne sèches plus dessus.
 
C'est le genre de truc qu'on rencontre peu fréquemment, mais qui peut te sauver la vie.


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 03-10-2011 à 17:59:34    

D'accord merci je comprend mieux.
Edit : bon je suis plus ou moins arrivé a faire ce que je voulais avec les regex, même si s'pas encore le top.


Message édité par spaik21 le 03-10-2011 à 22:37:28
Reply

Sujets relatifs:

Leave a Replay

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