Problème d'adaptation de script. (Résolu mais voir fin)

Problème d'adaptation de script. (Résolu mais voir fin) - PHP - Programmation

Marsh Posté le 12-08-2003 à 23:09:48    

Bonjour, je suis confronté à un problème embêtant et assez urgent, un ami a réalisé un script qui permet d uploader des fichier sur un site tout en remplissant une base de donnée, le script ci dessous, permet de gérer des fichiers de la forme :
 
classique : map_temps_pseudo_pays.zip
carte particulière CPM : map_cpm_temps_pseudo_pays.zip
temps supérieure à 1 minute : map_1minXX.XXX_pseudo_pays.zip
 
Tout marchait pour le mieux jusqu'à ce qu'une nouvelle version du jeu sorte et chamboulle la syntaxe qui devient :
 
map[df.type]xx.xx.xxx(pseudo.pays).dm_68
 
Ca perturbe encore plus le script d'origine qui reconnait les cartes de type CPM à leur nom qui est tout simplement xxx_cpm.
 
Je ne m'y connais pas trop en explode et compagnie, pourriez vous m'aiguiller svp ? L'enjeu est important des centaines de démos doivent être envoyées chaque jour et nous sommes bloqués car mon ami n'est pas en mesure de nous aider.
 
 :hello:  
 

Code :
  1. function writeFile($new) {
  2.   $total = file("newdemos.php" );
  3.   $f = fopen("newdemos.php","rw" );
  4.   $demos = split(";",$total[1]);
  5.   fwrite($f,$new." ; ".$total[1]." ; ".$total[2]." ; ".$total[3]." ; ".$total[4]);
  6.   fclose($f);
  7. }
  8.   include("../connect.php3" );
  9.   $tab = split("_",$Fichier_name);
  10.   $taille = count($tab);
  11.   $ext = split("\.",$tab[$taille-1]);
  12.   $tmp = split("min",$tab[$taille-3]);
  13.   if(count($tmp) == 1) {
  14.     $temps = doubleval($tab[$taille-3]);
  15.   } else {
  16.     $temps = doubleval($tmp[1])+doubleval($tmp[0])*60;
  17.     $temps = doubleval($temps);
  18.   }
  19.   if(strcmp($ext[1],"zip" ) == 0) {
  20.     if($temps != 0) {
  21.       if ($Fichier && $Fichier != "none" ) {
  22. if(!file_exists($Fichier_name)) {
  23.   if($email != "" ) {
  24.     $aut = 1;
  25.           } else {
  26.             echo "Vous n'avez pas rentrer d'e-mail";
  27.           }
  28.         } else {
  29.    echo "Cette Demo a déja été uploadée !!!<br>";
  30.    $ok = 0;
  31. }
  32.       }
  33.     } else {
  34.       echo "Format non valide : le fichier doit être comme ceci carte_temps_pseudo(sans _)_pays.zip<br>";
  35.       $ok = 0;
  36.     }
  37.   } else {
  38.     echo "Demo non-zippée<br>";
  39.     $ok = 0;
  40.   }
  41.   $pays = $ext[0];
  42.   $pseudo = $tab[$taille-2];
  43.   $map = $tab[0];
  44.   for($i = 1; $i <= ($taille-4) ; $i++) {
  45.     $map = $map."_".$tab[$i];
  46.   }


Message édité par Master_Jul le 18-08-2003 à 10:18:07

---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 12-08-2003 à 23:09:48   

Reply

Marsh Posté le 12-08-2003 à 23:11:23    

c'est pour ton taf?
 
si oui, tu rémunères combien pour ce travail qui -je le rapelle- mérite salaire?


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 12-08-2003 à 23:15:18    

SchnapsMann a écrit :

c'est pour ton taf?
 
si oui, tu rémunères combien pour ce travail qui -je le rapelle- mérite salaire?


 
c'est qu'un site bénévole www.defrag-france.net comme tu le vois, trône un PayPal pour les dons à droite qui sont inexistants, et je paie déjà l'hebergement entièrement à mes frais :/
 
c'est sûr que si je cherche je dois bien trouver mais j'ai quelques problèmes de temps là, exemple d'un travail à moi, censé être rénuméré :
 
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
Je demande pas qu'on me le fasse, je demande un peu d'aide, spa l'ANPE ce forum :/
 
A+


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 11:25:29    

:bounce:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 11:35:34    

il faut que tu utilises les expressions régulières, et donc changer le début de ton code.
si ca peut déjà un peu t'aider

Reply

Marsh Posté le 14-08-2003 à 11:40:16    

bin comme tu l'as si bien expliqué le probleme c'est que le nom de ton fichier a completement changer de structure et donc que les tests qu'effectuaient ton scripts doivent choucrouter maintenant.
 
En même temps à mon avis il te suffit de virer le control sur l'extension:

Code :
  1. if(strcmp($ext[1],"zip" ) == 0)


Et il devrait marchouiller, ce qui te laissera le temps de le peaufiner ensuite...

Reply

Marsh Posté le 14-08-2003 à 11:41:00    

Urd-sama a écrit :

il faut que tu utilises les expressions régulières, et donc changer le début de ton code.
si ca peut déjà un peu t'aider


 
ok merci, je suis sur la fonction ereg() je regarde :jap:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 11:57:09    

preferes preg, bcp plus rapide et plus puissant !

Reply

Marsh Posté le 14-08-2003 à 12:48:32    

karamilo a écrit :

preferes preg, bcp plus rapide et plus puissant !


 
je regarde mais je comprend pas tout de l'exemple
 
Eclatement d'une chaîne de recherche  
 

Code :
  1. <?php
  2. // scinde la phrase grâce aux virgules et espacements
  3. // ce qui inclus les " ", \r, \t, \n et \f
  4. $keywords = preg_split ("/[\s,]+/", "langage hypertexte, programmation" );
  5. ?>


 
"/[\s,]+/" Je comprend pas ce que ça contient en fait, dans mon cas, puis je faire ca ? :
 

Code :
  1. $record1 = preg_split ("[.]..(.).", "map[df.type]xx.xx.xxx(pseudo.pays).dm_68" );


 
où il faut juste spécifier "[].()" ?


Message édité par Master_Jul le 14-08-2003 à 12:49:02

---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 12:58:38    

ou avec split ?
 
<?php
$record = "map[df.type]xx.xx.xxx(pseudo.pays).dm_68";  
// Les délimiteurs peuvent être des tirets, points ou slash
list ($month, $day, $year) = split ('[.]()]', $record);
?>
 
 
ou explode ?
 
non on dirait que je ne peux pas car il ne permet pas d'utiliser plusieurs séparateurs


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 12:58:38   

Reply

Marsh Posté le 14-08-2003 à 13:02:53    

il faut échapper [, ) et . car ce sont des caracteres speciaux de la regex
il faut aussi délimiter ta regexp preg avec deux caracteres identiques genre #taregexp#specials
 
edit: \s est une classe de caractere et signifie tous les caracteres blancs ( tabulation, saut de ligne, espace ... )


Message édité par karamilo le 14-08-2003 à 13:04:31
Reply

Marsh Posté le 14-08-2003 à 13:31:16    

Ca pourrait donner ça ?
 
Si je prend soin d'échappper [, ) et .
 
$record = "map[df.type]xx.xx.xxx(pseudo.pays).dm_68";
$keywords = preg_split ("/[\[\]\.\(\)]+/", $record);
 
Où il faut que je fasse plusieurs "module" [...] ?
 
Je ne comprend pas très bien la syntaxe "/[...]+/"  
 
A quoi sert le + ici ?
 
 
Je n'ai pas compris : "il faut aussi délimiter ta regexp preg avec deux caracteres identiques genre #taregexp#specials ".
 
Merci beaucoup pour ton aide :jap:  :hello:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 13:51:54    

pas de probleme
 
dans une regex de type preg, il y a deux parties, l'expression et les options. La 1ere est delimitée au début et à la fin par un même caracteur ( qui doit pas etre alphanum ou antislash ).  
si le delimiteur est utilisee ds l'expression, il doit etre echappe ( antislash ).  
ca donne :
#expression#options
/expression/options
....
 
Les options :
i - recherche insensible à la casse.
m - recherche mutlilignes si l'expression est amenée à travailler sur des chaînes comportant des \n.
F - dans preg_replace permet d'appeler une fonction PHP pour fournir le caractère de remplacement (PHP 4.0.4).
A - "ancre" le masque, le motif recherché doit correspondre du début à la fin à l'expression régulière.
S - permet d'optimiser l'expression régulière si elle est appelée plusieurs fois, par exemple lors d?un traitement récursif ou en boucle.
s - le méta caractère point (.) prend toutes les valeurs, y compris le saut de ligne.
U - Limite la gourmandise de toute l?expression rationelle.
 
Ce qui est entre crochets [] est une classe de caractere et ce qui est entre paranthèses () est un sous motif, utile par exemple pour les references arrieres.
 
ta regex est pas mal, reste a tester ;)  
[...]+ veut dire qu'il faut un ou plus caractères qu'il y a entre []
par ex : [a1]+ = au moins un "a" ou un "1"  
au contraire, * a la place de + => 0 ou plus de caracteres
et ? => 0 ou un seul caractere
 
tu peux definir le nombre precis avec {nbdebut,nbfin} qui represente l'intervalle possible :
a{2,4} => il faut entre 2 et 4 "a"


Message édité par karamilo le 14-08-2003 à 13:54:44
Reply

Marsh Posté le 14-08-2003 à 13:57:01    

Ca a l'air de marcher karamilo ! Merci beaucoup ! :hello:  
 
<?php
 
$record = "map[df.type]xx.xx.xxx(pseudo.pays).dm_68";  
$keywords = preg_split ("/[\[\]\.\(\)]+/", $record);  
 
print_r($keywords);
 
?>
 
Array ( [0] => map [1] => df [2] => type [3] => xx [4] => xx [5] => xxx [6] => pseudo [7] => pays [8] => dm_68 )


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 14:11:21    

impec :) :hello:

Reply

Marsh Posté le 14-08-2003 à 14:26:05    


 
puis-je te demander un dernier service s'il te plait, le script répond presque à mes attentes, j'ai fais ceci qui me comble :
 
$record = "flow[df.cpm]00.16.584(-MdC-AhfeeL.Reunion).dm_68";  
$keywords = preg_split ("/[\[\]\.\(\)]+/", $record);  
$temps = "$keywords[3].$keywords[4].$keywords[5]";
 
// print_r($keywords);
//echo '<br>';
// echo '<br>';
echo "Le script traite le record suivant : $record.";
echo '<br>';
echo "La map choisie est $keywords[0].";
 
Seul soucis, les joueurs ne doivent pas avoir un pseudo contenant . [] et () ce qui risque de poser soucis, penses tu qu'il y aurait un moyen de palier ce petit défaut ?  
 
Merci d'avance.


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 16:13:58    

me revoila
 
le mieux ici est carrément de faire un preg_replace, sinon, ca serait "dangereux" de spliter le pseudo lui meme avec des [ ] ...  
 
d'ou :
 

Code :
  1. $record = "flow[df.cpm]00.16.584(-MdC-Ahf[])')())eeL.Reunion).dm_68"; 
  2. $map = preg_replace("#^(.*?)\[df\.(.*?)\]([0-9]{2})\.([0-9]{2})\.([0-9]{3})\((.*?)\.(.*?)\)\.dm_68$#","$1 $2 $3 $4 $5 $6 $7",$record);
  3. $map = explode(" ",$map);

 
 
ca cherche le motif type puis mets le contenu changeant sous forme : var1 var2 var3
puis un simple explode des espaces et tu retrouves $map[0] == var1 ...  
 
voila le resultat :
http://213.245.121.150/~karamilo/ti.php
 
les chiffres a la fin, c'est le tps d'execution pour voir si c'est potable ou pas. Ici, on a du 0.2 ms a peu pres, ce qui est impec :)
 
ps: j'avais vu ton programme pour les lans et ton site, bravo :jap:

Reply

Marsh Posté le 14-08-2003 à 17:49:58    

J'ai un petit problème, même en recopiant ton code je n'obtient rien dans l'echo.  :??:  
 

Code :
  1. $record1 = "flow[df.cpm]00.16.584(-MdC-Ahf[])')())eeL.Reunion).dm_68"; 
  2.  
  3.   $map = preg_replace("#^(.*?)\[df\.(.*?)\]([0-9]{2})\.([0-9]{2})\.([0-9]{3})\((.*?)\.(.*?)\)\.dm_68$#","$1 $2 $3 $4 $5 $6 $7",$record1);
  4.   $map = explode(" ",$map);
  5.  
  6.   echo "$map[0]";


 
Merci pour le script et le site  :) Dommage que ça ce soit mal terminé :( .


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 17:55:05    

bizarre ca, regarde le lien du dessus, j'ai c/c et uploade la page.
tu as essayé sur une page de test?

Reply

Marsh Posté le 14-08-2003 à 18:10:21    

C'est de ma faute désolé, ça a l'air de marcher, j'avais eu un décalage à cause du df qui n'est plus considéré comme une variable, il me faudrait par contre l'extension comme une variable $8, j essai de comprendre la syntaxe


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 18:35:19    

ok tout est bon, encore merci !  :jap:  :jap:  :jap:  :hello:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-08-2003 à 18:48:33    

pas de probleme :)  
si tu as un autre probleme, hesites pas

Reply

Marsh Posté le 15-08-2003 à 16:16:28    

de retour, j'ai un petit soucis pas trop grave, un joueur utilisait le pseudo Mdc.Scam, le point induit en erreur le script avec ce masque :
 
"#^(.*?)\[df\.(.*?)\]([0-9]{2})\.([0-9]{2})\.([0-9]{3})\((.*?)\.(.*?)\)\.(.*?)#"
 
Dans ton exemple tu n'avais pas mis de point, c'est peut être pour ça que tu n'as pas vu que ça posait problème.


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 15-08-2003 à 16:18:10    

si on vire le . de la paranthèse du pays ça marche  ? (?*) c'est bon ?  [:meganne]
 
edit : non ça marche pas


Message édité par Master_Jul le 15-08-2003 à 16:28:29

---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 18-08-2003 à 10:17:35    

:bounce:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 18-08-2003 à 10:50:33    

Master_Jul a écrit :

J'ai un petit problème, même en recopiant ton code je n'obtient rien dans l'echo.  :??:  
 

Code :
  1. $record1 = "flow[df.cpm]00.16.584(-MdC-Ahf[])')())eeL.Reunion).dm_68"; 
  2.  
  3.   $map = preg_replace("#^(.*?)\[df\.(.*?)\]([0-9]{2})\.([0-9]{2})\.([0-9]{3})\((.+)\.(.+)\)\.dm_68$#","$1 $2 $3 $4 $5 $6 $7",$record1);
  4.   $map = explode(" ",$map);
  5.  
  6.   echo "$map[0]";


 
Merci pour le script et le site  :) Dommage que ça ce soit mal terminé :( .


 
 
juste

Reply

Marsh Posté le 18-08-2003 à 11:37:45    


 
hello, tu peux me confirmer que mon problème de "." n'est pas résolvable ?


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 18-08-2003 à 11:55:36    

si, regarde le code juste au dessus, c'est modifié
 
avec le ? a la fin, ca va chercher au plus court possible. Au contraire, sans ?, le plus long possible.  
ca sert aussi lors d'imbrications par exemple.


Message édité par karamilo le 18-08-2003 à 11:57:01
Reply

Marsh Posté le 18-08-2003 à 13:07:19    

karamilo a écrit :

si, regarde le code juste au dessus, c'est modifié
 
avec le ? a la fin, ca va chercher au plus court possible. Au contraire, sans ?, le plus long possible.  
ca sert aussi lors d'imbrications par exemple.


 
merci  :love:  :jap: mais où as tu appris tout ça ?


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 18-08-2003 à 13:08:27    

sur le web

Reply

Marsh Posté le 18-08-2003 à 13:11:38    


 
moi aussi mais je n'ai pas poussé à ce point, peut être que si j'avais recherché un peu :whistle: enfin c'est ce que j'ai fait mais j'avais vraiment du mal avec ces pattern, encore merci :jap:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 18-08-2003 à 13:12:14    

pas de probleme ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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