Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 11 septembre 2005 - 22 h 53 m 06 s |
|
|
Bon voila, je suis en train d'essayer de décortiquer des morceau de texte qui sont de la forme :
09-09 23:01:50 Commandement de flot Rapport de espionnage RX8atmo [5:233:8]
Matières premières sur RX8atmo [5:233:8] pour 09-09 23:01:50
Métal: 60635 Cristal: 32552
Deutérium: 14496 Énergie: 2324
Flottes
Défense
Lanceur de missiles 3 Missile interception 4
Missile interplanétaire 2
Bâtiments
Mine de métal 16 Mine de cristal 15
Synthétiseur de deutérium 13 Centrale électrique solaire 19
Usine de robots 8 Chantier spatial 6
Hangar de métal 1 Hangar de cristal 1
Laboratoire de recherche 9 Silo à missile 4
Recherche
Technique espionnage 4 Technologie ordinateur 4
Technologie armes 5 Technologie de bouclier 6
Technologie de protection des vaisseaux spatiaux 5 Technologie énergie 6
Technologie hyperespace 3 Réacteur à combustion interne 6
Réacteur à impulsion 5 Propulsion hyperespace 3
Technologie de laser 5 Technologie ions 5
Probabilité de défense contre-espionnage:0%
|
Il y a des espaces cachés ici.
Pour ceux qui ont reconnu, c'est bien un rapport d'espionnage ogame.
Pour les autres : ici, de statique il n'y a que la première ligne et la dernière ("Probabilité de défense [...]"). Les champs sous "matières première" et au dessus de "flottes" sont statiques, quand ils sont présents. Entre "flottes" et "défense", il peut n'y avoir rien comme il peut y avoir des champs (13 différents en tout). Idem pour la défense, les batiments et la recherche.
Comme je veut récupérer tout les champs, (au maximum 65) il faut que je le fasse en plusieurs fois, car le tableau de résultat des parenthèses capturantes fait 10 éléments. Assez pénible le bestiau !
Pour ne pas me faire embêter, je supprime tout les retours a la ligne pour commencer.
Ensuite je fait un premier tri avec cette regex :
$expr = "([0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) Commandement de flot Rapport de espionnage ([a-zA-Z0-9 ]+) \[([0-9]:[0-9]{1,3}:[0-9]{1,2})\] ";
$expr .= "(Matières premières.*)[ ]*";
$expr .= "(Flottes.*)*[ ]*";
$expr .= "(Défense.*)*[ ]*";
$expr .= "(Bâtiments.*)*[ ]*";
$expr .= "(Recherche.*)*[ ]*";
$expr .= "Probabilité de défense contre-espionnage:([0-9]{1,3})%";
|
La première ligne est bonne.
C'est après que ca ne va plus : le .* qui est dans les parenthèses (après Matières premières dans notre cas) match tout le reste de la regex... normal, il n'y a plus rien d'obligatoire après, sauf la probabilité de défense, qu'il me récupère bien dans le 9ème élément du tableau.
J'ai donc un problème. Il faut que je match tout jusqu'a la catégorie suivante, mais on ne sais pas laquelle c'est car elles sont facultatives. Comment je peut faire ?
mon code de test :
1. <html>
2.
3. <head>
4. <title></title>
5. </head>
6.
7. <body>
8. <form action="#" method="post">
9. rapport : <textarea name="rapport"></textarea><br/>
10. joueur : <input type="text" name="name"><br/>
11. alliance : <input type="text" name="alliance"><br/>
12. <input type="submit">
13. </form>
14. <hr/>
15. <?php
16. if ($_POST['rapport'])
17. {
18. $_POST['rapport'] = str_replace("
19. ", "", $_POST['rapport']);
20. echo $_POST['rapport']."<br/>";
21. $expr = "([0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) Commandement de flot Rapport de espionnage ([a-zA-Z0-9 ]+) \[([0-9]:[0-9]{1,3}:[0-9]{1,2})\] ";
22. $expr .= "(Matières premières.*)[ ]*";
23. $expr .= "(Flottes.*)*[ ]*";
24. $expr .= "(Défense.*)*[ ]*";
25. $expr .= "(Bâtiments.*)*[ ]*";
26. $expr .= "(Recherche.*)*[ ]*";
27. $expr .= "Probabilité de défense contre-espionnage:([0-9]{1,3})%";
28. if (ereg ($expr, $_POST['rapport'], $reg))
29. {
30. echo "<hr>Reg 1 = $reg[1]<hr>Reg 2 = $reg[2]<hr>Reg 3 = $reg[3]<hr>Reg 4 = $reg[4]<hr>Reg 5 = $reg[5]<hr>Reg 6 = $reg[6]<hr>Reg 7 = $reg[7]<hr>Reg 8 = $reg[8]<hr>Reg 9 = $reg[9]<hr>Reg 10 = $reg[10]";
31. } else {
32. echo "Format invalide";
33. }
34. }
35.
36. ?>
37.
38. </body>
39.
40. </html>
|
|
| |
Message édité 2 fois, la dernière par Woofy le 11 septembre 2005 - 22 h 54. |
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 00 h 04 m 22 s |
|
|
En Java, j'aurai sous-découpé avec des conditions if sur les intitulés...
Les regex c'est bien, mais il y a souvent plus simple et plus rapide
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 00 h 13 m 46 s |
|
|
Ouais... mais s'il n'y a pas les intitulés ?
Bon je vais essayer comme ca.
Je viens de me taper tout le code source de speedsim pour voir comment ils faisaient, ils n'utilisent pas les regex. Mais bon, j'aimerais que ce soit pas trop lent a faire, et bon les regex, quand on a le bon truc, c'est plus facile
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 421 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 12 septembre 2005 - 08 h 15 m 56 s |
|
|
complètement HS, mais la structure de fichier que tu indiques semble bien adaptée à du XML. Demande donc une modif pour qu'on te livre un fichier XML, et en java ce sera du tout cuit
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 09 h 24 m 18 s |
|
|
Le 12 septembre 2005 - 00 h 13, Woofy a écrit :
Ouais... mais s'il n'y a pas les intitulés ?
Bon je vais essayer comme ca.
Je viens de me taper tout le code source de speedsim pour voir comment ils faisaient, ils n'utilisent pas les regex. Mais bon, j'aimerais que ce soit pas trop lent a faire, et bon les regex, quand on a le bon truc, c'est plus facile 
|
Mais tu peux tout à fait faire un mélange de code traditionnel et de regex :
le code traditionnel, via des conditions, détecte et sépare les parties (réflechis bien, si tu regarde, quelque soit le contenu, la syntaxe est la même pour les intitulés uniquement)) et passe la main pour chaque partie à une regex pour en extraire le contenu facilement...
Mais je persiste à croire qu'en Java, un StreamTokenizer serait plus adapté...
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 11 h 50 m 37 s |
|
|
Le 12 septembre 2005 - 08 h 15, bernie38 a écrit :
complètement HS, mais la structure de fichier que tu indiques semble bien adaptée à du XML. Demande donc une modif pour qu'on te livre un fichier XML, et en java ce sera du tout cuit 
|
Heu non je crois pas.
La technique pour récupérer le fichier, c'est ctrl A, ctrl C, ctrl V !
gégé : le java pour un site web, c'est pas top top ! Une applet c'est assez lourd, et bon c'est pas sur un serveur puissant que ca va tourner.
|
|
| |
Message édité 1 fois, la dernière par Woofy le 12 septembre 2005 - 11 h 52. |
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 12 h 48 m 11 s |
|
|
Le 12 septembre 2005 - 11 h 50, Woofy a écrit :
gégé : le java pour un site web, c'est pas top top ! Une applet c'est assez lourd, et bon c'est pas sur un serveur puissant que ca va tourner.
|
Il se joue de moi
Si tu savais que Java est réputé pour être justement un langage spécialisé pour le web, tu rigolerais 
Qui te parle d'applet ? Un programme Java n'a pas besoin d'être exécuté dans une page Web que je sache ?
Ensuite, pour tokenizer les quelques lignes de texte, je te rassure, la machine va pas être à genoux
M'enfin, bref, tu prends le langage que tu veux, spa un problème, mais je te dis juste que tout en regex n'est pas forcément la meilleure des solutions dans ton cas ici.
Si tu regardes ce que je t'ai dit sur la séparation des préoccupations (découpe ton code en une partie itérative et une partie regex), tu verras que tu iras bcp plus vite qu"avec des regex pour tout...
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 12 h 54 m 03 s |
|
|
Oui oui c'est ce que je vais faire. Mais en php. Java chui trop une branque encore (free ou host.sk ils acceptent le java?)
|
|
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 13 h 06 m 48 s |
|
|
Le 12 septembre 2005 - 12 h 54, Woofy a écrit :
Oui oui c'est ce que je vais faire. Mais en php. Java chui trop une branque encore (free ou host.sk ils acceptent le java?)
|
Mais fais le en php, si tu y arrives mieux, j'ai pas la prétention de vouloir imposer un langage
Pour répondre à ta question, concernant les programmes Java, il existe différentes choses :
1/ les programmes "standalone", lancables en ligne de commande et donc non intégrables sur un site Web
2/ les applets, fichiers class hébergés où tu veux, et appelés par la page Web et exécutés chez le client : tous les hébergeurs acceptent puisque le code s'exécute sur le client
3/ les servlets et les JSP : les servlets sont des class s'exécutant sur le serveur et les JSP sont des pages Web avec du code Java directement dedans (un peu comme PHP). Dans les 2 cas, il faut un moteur (un peu comme PHP) permettant d'exécuter sur le serveur, et un bon exemple est Tomcat (de la fondation Apache). Et ca, c'est jamais dispo sur les serveurs Free, pour 3 bonnes raisons : faut installer Tomcat, ca pompe les ressources du serveur, et ca s'exécute sur le serveur.
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 13 h 18 m 35 s |
|
|
En gros, si je voulais utiliser du java sans utiliser d'applet (je persiste a dire que c'est trop lourd ! Du moins pour ce que je veut faire) il faudrait que je fasse un prog en ligne de commande, et y accéder avec la fonction system(). Ok, me coucherais moins con ce soir 
Au fait gégé, tu t'y connais un peu en rapport d'espionnage ogame?
EDIT : en fait non, pour le rapport d'espionnage j'ai trouvé ce que je cherchais.
|
|
| |
Message édité 1 fois, la dernière par Woofy le 12 septembre 2005 - 13 h 23. |
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 15 h 40 m 33 s |
|
|
Bon voila la suite : j'ai fait comme tu m'a dit gégé, j'ai séparé les parties avec une série de strpos et substr. Ca marche au poil !
J'ai également commencé a traiter l'entête pour récupérer la date, l'heure, le nom de la planète et sa position. Ca ça marche.
Je traite aussi les ressources pour les récupérer, ça marche aussi. Tout ça avec des regex.
Maintenant se pose un ptit problème : les regex sont limités a 10 parenthèses capturantes.
Or, pour les batiments, les recherches, les flottes et les défenses, j'en ai besoin de beaucoup plus.
J'ai la solution évidente d'y aller a grand coup de strpos et substr, mais le traitement risque d'être un peu plus long, et bon si je peut gagner un peu de temps...
Voici mon bout de code actuel :
1. <html>
2.
3. <head>
4. <title></title>
5. </head>
6.
7. <body>
8. <form action="#" method="post">
9. rapport : <textarea name="rapport"></textarea><br/>
10. joueur : <input type="text" name="name"><br/>
11. alliance : <input type="text" name="alliance"><br/>
12. <input type="submit">
13. </form>
14. <hr/>
15.
16. <?php
17. if ($_POST['rapport'])
18. {
19. $_POST['rapport'] = str_replace("
20. ", "", $_POST['rapport']);
21. echo $_POST['rapport']."<br/>";
22. if (($pos_fin = strpos($_POST['rapport'], "Probabilité de défense contre-espionnage")) === false) $pos_fin = strlen($_POST['rapport']);
23. if (($pos_mp = strpos($_POST['rapport'], "Matières premières")) !== false)
24. {
25. $entete = substr($_POST['rapport'], 0, $pos_mp);
26. if (($pos_ship = strpos($_POST['rapport'], "Flottes")) !== false)
27. {
28. $ressources = substr($_POST['rapport'], $pos_mp, $pos_ship - $pos_mp);
29. if (($pos_def = strpos($_POST['rapport'], "Défense")) !== false)
30. {
31. $flotte = substr($_POST['rapport'], $pos_ship, $pos_def - $pos_ship);
32. if (($pos_build = strpos($_POST['rapport'], "Bâtiments")) !== false)
33. {
34. $defense = substr($_POST['rapport'], $pos_def, $pos_build - $pos_def);
35. if (($pos_tech = strpos($_POST['rapport'], "Recherche")) !== false)
36. {
37. $batiments = substr($_POST['rapport'], $pos_build, $pos_tech - $pos_build);
38. $technologies = substr($_POST['rapport'], $pos_tech, $pos_fin - $pos_tech);
39. }
40. else
41. {
42. $batiments = substr($_POST['rapport'], $pos_build, $pos_fin - $pos_build);
43. }
44. }
45. else
46. {
47. $defense = substr($_POST['rapport'], $pos_def, $pos_fin - $pos_def);
48. }
49. }
50. else
51. {
52. $flotte = substr($_POST['rapport'], $pos_ship, $pos_fin - $pos_ship);
53. }
54. }
55. else
56. {
57. $ressources = substr($_POST['rapport'], $pos_mp, $pos_fin - $pos_mp);
58. }
59. }
60. else
61. {
62. $entete = substr($_POST['rapport'], 0, $pos_fin);
63. }
64. echo "<hr/>$entete<hr/>$ressources<hr/>$flotte<hr/>$defense<hr/>$batiments<hr/>$technologies<hr/>";
65. $expr_entete = "([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) Commandement de flot Rapport de espionnage ([a-zA-Z0-9 ]+) \[([0-9]):([0-9]{1,3}):([0-9]{1,2})\] ";
66. $expr_ressources .= "Métal: ([0-9]+) Cristal: ([0-9]+) Deutérium: ([0-9]+) Énergie: (-*[0-9]+)";
67.
68.
69. if (strlen($entete) != 0 && ereg($expr_entete, $entete, $reg_entete))
70. {
71. echo "Entête :<br/>Jour : $reg_entete[2] | Mois : $reg_entete[1] | Heure : $reg_entete[3] | Minutes : $reg_entete[4] | Secondes : $reg_entete[5] | Planète : $reg_entete[6] | Galaxie : $reg_entete[7] | Systeme : $reg_entete[8] | Position : $reg_entete[9]<br/><br/>";
72. }
73. else
74. {
75. echo "Entête invalide ou inexistante<br/><br/>";
76. }
77. if (strlen($ressources) != 0 && ereg($expr_ressources, $ressources, $reg_ressources))
78. {
79. echo "Ressources :<br/>Métal : $reg_ressources[1] | Cristal : $reg_ressources[2] | Deutérium : $reg_ressources[3] | Energie : $reg_ressources[4]<br/><br/>";
80. }
81. else
82. {
83. echo "Ressource invalide ou inexistantes<br/><br/>";
84. }
85. }
86.
87. ?>
88.
89. </body>
90.
91. </html>
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 18 h 53 m 27 s |
|
|
Bon ca marche maintenant. J'ai fait en fait une regex par champ que je veut récupérer. C'est bourrin, mais bon ca va plus vite je pense que de faire des strpos et des substr.
Je vous colle pas le code, y en a pour 364 lignes. A bientot pour de nouvelles aventures
|
|
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 18 h 54 m 58 s |
|
|
Le bourrin, y a qu'ça d'vrai
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 18 h 58 m 28 s |
|
|
Et en plus, j'en suis qu'au début
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 20 h 04 m 04 s |
|
|
J'ai une question, je met mon code sur le serveur de free, ca merde.
Je le met en local chez moi ca marche.
Pourtant, aucune modification.
Pendant un moment, ca a marché chez free, et dès que j'upload un nouveau truc, ca remerde ! Je comprend pas du tout !
J'ai l'impression que c'est ereg qui merde chez free et pas chez moi !
Vais mettre preg_match !
Bon ben preg_match ne resoud pas le problème. Je comprend pas pourquoi ca ne marche pas chez free, mais que ca marche chez moi !
Mon code si vous le voulez : http://florianwoofy.free.fr/index.rar
|
|
| |
Message édité 4 fois, la dernière par Woofy le 12 septembre 2005 - 20 h 19. |
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 21 h 05 m 40 s |
|
|
Je pense que j'ai compris : sous windows, on a /r/n, alors que sous unix seul /n existe. Et ca a l'air de poser un problème pour les regex.
Comment faire pour virer tout les /r/n et /n? Je pensais que mon str_replace au début suffisait mais on dirait pas !
EDIT : j'ai fait 2 str_replace, un pour /r/n, l'autre pour /n, ca marche nikel !
|
|
| |
Message édité 1 fois, la dernière par Woofy le 12 septembre 2005 - 21 h 07. |
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 102 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 12 septembre 2005 - 21 h 15 m 11 s |
|
|
Y a pas une fonction de normalisation sous PHP pour éviter ce genre de problème ?
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 286 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 12 septembre 2005 - 21 h 27 m 36 s |
|
|
Bah je sais pas du tout. Je ne sais pas sous quel format sont récupérés les infos dans le champ texte, probablement dans le format du client. Et comme j'avais mis un retour a la ligne dans le code du str_replace, donc un retour selon le serveur free, ca devait pas marcher... ce que je trouve bizarre, c'est que suivant les uploads que je faisait, ca marchait.
Bon ca marche, je touche plus, et on verra bien !
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 421 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 13 septembre 2005 - 08 h 23 m 23 s |
|
|
si jamais c'est comme en C (donc si c'est bien fait  ), tu mets \n et les couches basses se débrouillent : sous unix on aura 0A et sous windows 0D0A.
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
iraysyvalo
-
Messages : 9 647 Inscrit le 19/11/02
Ville : Lyon
Non connecté
|
|
Posté le 13 septembre 2005 - 08 h 56 m 34 s |
|
|
Dans tes regexp, $ pour fin de chaine devrait suffire .. comme ca, tu fais abstraction des fins de ligne .. enfin, essaies
|
|
| |
Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.
|