Expressions régulières, recherche ds un .txt

Expressions régulières, recherche ds un .txt - PHP - Programmation

Marsh Posté le 30-10-2005 à 16:11:49    


Bonjour,  
 
J'ai un projet PHP (création de site de commerce électronique, le truc typique :D) à faire. Je ne vous demande en aucun cas de me faire le travail à ma place, je poserai juste quelques questions quand je suis bloqué. Comme maintenant, en somme (:D)
 
Je dois, à partir d'un fichier .txt formatté d'une certaine manière et fourni, créer une base de donnée mysql pour gérer les articles vendus sur le site de commerce en question. Ds un 1er temps, j'essaye d'extraire de ce fichier les infos qui m'intéresent.
 
Ce fichier .txt est le suivant (modèle):
 

Citation :

Produit:Propriete(Libelle)=La barre de fer;Propriete(Prix)=29.90;Propriete(UniteDeVente)=l'unité;Descriptif=Barre Métallique|Accessoire|Gymnastique;Propriete(Photo)=barre_de_fer.jpg;Rubriques=Accessoire de gymnastique|Bricolage;Rubrique:Nom=Accessoire de gymnastique;RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique;RubriquesSuperieures=Sport d'intérieur


 
Maintennant, j'ai fait ceci:
 

Code :
  1. $fd = fopen("../modele.txt", "r" );
  2. while(!feof($fd))
  3. {
  4. $buffer = fgets($fd, 4096);
  5. $tab = explode(";",$buffer);
  6. }
  7. fclose($fd);
  8. foreach($tab as $clef => $valeur)
  9. {
  10. echo $clef." --> ".$valeur."<br>";
  11. }


 
et ça marche :o :D (le tableau était pour tester, peut-être que c'est plus facile comme ça)
 
... et la, je souhaiterais extraire des infos spécifiques, comme par exemple "La barre de fer", c'est à dire ce qui est compris entre "Propriete(Libelle)=" et un ";". Puis j'aimerais extraire toutes les propriétés pour les utiliser lors de la création de la base de données.
 
Ce que je n'arrive pas à faire, c'est l'extraction. Si ereg() teste si un motif existe et ereg_replace() remplace un motif, comment en extraire un et le mettre ds une nouvelle variable ? Je débute en php, si quelqu'un pouvait me donner un indice ou 2, ça serait bien gentil
 
 :hello:  
 


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 30-10-2005 à 16:11:49   

Reply

Marsh Posté le 30-10-2005 à 16:57:12    

preg_match a un troisième argument qui permet de récupérer une partie de ta chaîne spécifiée dans le masque.
 
Voir http://fr.php.net/preg_match


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

Marsh Posté le 30-10-2005 à 17:03:51    

'vais tenter, merci déja :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 30-10-2005 à 18:59:29    

Bon j'arrive tjours au même résultat: pas celui que je veux :D :sweat:  
 
J'ai ceci comme sortie HTML, qui me semble être un bon début:
 

Code :
  1. Produit:Propriete(Libelle)=La barre de fer
  2. Propriete(Prix)=29.90
  3. Propriete(UniteDeVente)=l'unité
  4. Descriptif=Barre Métallique|Accessoire|Gymnastique
  5. Propriete(Photo)=barre_de_fer.jpg
  6. Rubriques=Accessoire de gymnastique|Bricolage
  7. Rubrique:Nom=Accessoire de gymnastique
  8. RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique
  9. RubriquesSuperieures=Sport d'intérieur


 
J'aimerais récupérer "La barre de fer" dans une variable Libelle, par ex, et ainsi de suite pour les autres ... help :(


Message édité par ParadoX le 30-10-2005 à 19:01:32

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 30-10-2005 à 22:03:05    

T'as des connaissances en regexp ou pas du tout ? Parce que c'est pas bien compliqué là.


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

Marsh Posté le 30-10-2005 à 22:15:56    

Je débute, je connais les règles de base, mais ça s'arrete la.  
 
Avec...
 

Code :
  1. $test = $tab[0];
  2. $libelle = ereg_replace("^(.*):(.*)=", " ", $test);
  3. echo $libelle."<br>";
  4. $test = $tab[1];
  5. $prix = ereg_replace("(.*)=", " ", $test);
  6. echo $prix."<br>";


 
... je récupere les infos unes à unes, mais il me faudrait une possibilité de tout filtrer d'un coup, avec une longue expression. Je ne sais pas trop comment procéder sinon :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 30-10-2005 à 22:24:31    

Ben je t'ai filé la doc de preg_match, c'est fait pour ça. En fait, preg_match_all serait encore plus adaptée ici, car elle te permet de ne pas avoir à splitter ta chaîne par ligne (voir l'option "m" ici : http://fr.php.net/manual/fr/refere [...] iers.php).
 
Sinon ton masque tel que tu l'as écrit prend ce qu'il y a avant le : et entre le : et le =, pas ce qu'il y a après.


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

Marsh Posté le 30-10-2005 à 22:32:49    

J'ai bien essayé le preg_match, mais à chaque fois il me disait que mon filtre ne devait pas être alphanumérique ni Slash ... je n'ai pas bien compris :/
Je continuerai demain, merci de ton aide en tout cas :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 30-10-2005 à 22:36:28    

Faut entourer ton masque avec des caractères genre # (ou presque n'importe quel caractère qui pourra être ignoré dans le reste du masque).
 
Ex. : preg_match('#^[0-9]*abc$#', $chaine);


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

Marsh Posté le 31-10-2005 à 17:19:24    

Hmm je teste, je teste ... mais je n'arrive pas à extraire ce que je veux :/
 

Code :
  1. $pattern = '#(.*)=#';
  2. preg_match_all($pattern, $buffer, $out, PREG_PATTERN_ORDER);
  3. print_r($out);


 
Je donne
 

Code :
  1. Array ( [0] => Array ( [0] => Produit:Propriete(Libelle)=La barre de fer;Propriete(Prix)=29.90;Propriete(UniteDeVente)=l'unité;Descriptif=Barre Métallique|Accessoire|Gymnastique;Propriete(Photo)=barre_de_fer.jpg;Rubriques=Accessoire de gymnastique|Bricolage;Rubrique:Nom=Accessoire de gymnastique;RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique;RubriquesSuperieures= ) [1] => Array ( [0] => Produit:Propriete(Libelle)=La barre de fer;Propriete(Prix)=29.90;Propriete(UniteDeVente)=l'unité;Descriptif=Barre Métallique|Accessoire|Gymnastique;Propriete(Photo)=barre_de_fer.jpg;Rubriques=Accessoire de gymnastique|Bricolage;Rubrique:Nom=Accessoire de gymnastique;RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique;RubriquesSuperieures ) )


 
... ce qui est correct pour array[0], mais dans array[1] je devrais avoir ma chaine filtrée
 
Je pensais récupérer tout ce qui se trouve après un " = ", mais je n'y parviens pas :/
Désolé :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 31-10-2005 à 17:19:24   

Reply

Marsh Posté le 31-10-2005 à 17:50:52    

Bon, comme je bloque, je vais tenter de le faire ligne par ligne, comme au début:
 

Code :
  1. $fd = fopen("../modele.txt", "r" );
  2. while(!feof($fd))
  3. {
  4. $buffer = fgets($fd, 4096);
  5. $tab = explode(";",$buffer);
  6. }
  7. fclose($fd);


 
qui me donne
 

Code :
  1. Produit:Propriete(Libelle)=La barre de fer
  2. Propriete(Prix)=29.90
  3. Propriete(UniteDeVente)=l'unité
  4. Descriptif=Barre Métallique|Accessoire|Gymnastique
  5. Propriete(Photo)=barre_de_fer.jpg
  6. Rubriques=Accessoire de gymnastique|Bricolage
  7. Rubrique:Nom=Accessoire de gymnastique
  8. RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique
  9. RubriquesSuperieures=Sport d'intérieur


 
et maintenant, je fais une regex pour chaque ligne. Enfin j'essaye.
 

Code :
  1. foreach($tab as $clef => $valeur)
  2. {
  3. if(eregi('=.*;', $valeur, $out))
  4. {
  5.  print_r($out);
  6. }
  7. }


 
... ne marche pas :/
 
Je veux (en français): "Tous les caractères situés entre un = et un ;"


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 31-10-2005 à 18:48:58    

Essaie ça sur le contenu de ton fichier (sans splitter) :
 

Citation :


preg_match_all('#Propriete\(([^\)]*)\)=([^;]*)#', $buffer, $matches);
 
print_r($matches[1]);
print_r($matches[2]);


 
Si ça fonctionne, essaie de comprendre la regexp, elle n'est pas bien compliquée.


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

Marsh Posté le 31-10-2005 à 19:29:13    

Oh merci :jap:  
 
je ne comprends pas le ([^\]*) ni le ([^;}*)  :/
 
([^\]*) --> ce qui suit Propriete, en début de ligne ... et puis ? pourquoi le \] ?
pareil pour le 2eme ...
 
Tu pourrais me l'expliquer ? :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 31-10-2005 à 19:48:57    

ParadoX a écrit :

Oh merci :jap:  
 
je ne comprends pas le ([^\]*) ni le ([^;}*)  :/
 
([^\]*) --> ce qui suit Propriete, en début de ligne ... et puis ? pourquoi le \] ?


 
C'est pas ([^\]*) mais ([^\)]*).  
 
[^\)] veut dire "n'importe quel caractère qui n'est pas une parenthèse fermante".  
[^\)] veut dire "n'importe quel caractère qui n'est pas une parenthèse fermante", répété 0 ou plusieurs fois.
([^\)]) permet de capturer cette suite de caractères.
 
Pour le deuxième, c'est exactement pareil, sauf que c'est un point-virgule au lieu d'être une parenthèse fermante.


Message édité par sielfried le 31-10-2005 à 19:49:23

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

Marsh Posté le 31-10-2005 à 20:15:33    

merci d'avoir pris le temps de m'expliquer :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 31-10-2005 à 23:39:29    

C'est encore moi avec une petite question (pour changer :D)
 
Pour la premiere partie, ça marche bien comme je le voulais:
 

Code :
  1. $pattern_produit = '#Propriete\(([^\)]*)\)=([^;]*)#';


 
donne ça:
 

Code :
  1. produits :
  2. Array ( [0] => Libelle [1] => Prix [2] => UniteDeVente [3] => Photo )
  3. Array ( [0] => La barre de fer [1] => 29.90 [2] => l'unité [3] => barre_de_fer.jpg )


 
Pour la partie "Rubriques", j'ai donc fait une 2eme recherche que voici:
 

Code :
  1. $pattern_rubrique = '#Rubrique:([^=]*)=([^;]*)#';


 
et il me sort
 

Code :
  1. rubriques :
  2. Array ( [0] => Nom [1] => Nom )
  3. Array ( [0] => Accessoire de gymnastique [1] => Gymnastique )


 
 
... mais comment se fait-il qu'il ne me prenne pas en compte les "RubriquesSuperieures" ?  :sweat: Il ne trouve que les noms, et pourtant j'ai précisé comme regex: "Rubrique:, puis tout sauf un = une ou plusieurs fois, un autre =, puis tout sauf un ; plusieurs fois.  
 
C'est quoi le truc ? :sweat:  
 
 :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 01-11-2005 à 03:51:03    

En reformulé, je voudrais faire UNE regex à partir de ces 2
 

Code :
  1. $pattern_rubrique = '#Rubrique:([^=]*)=([^;]*)#';
  2. $pattern_rubriquessuperieures = '#(RubriquesSuperieures)=([^\n\r]*)#';


 
Dans le cas des produits, il y avaient des ( ) partout, c'est ce qui a permis le repérage. Ici, ds le 1er cas on a un :Nom= et puis un RubriquesSuperieures=
C'est possible ?
 
Les 2 marchent séparément, pkoi pas ensembles ?
 
EDIT: Meme probleme avec la regex des produits, en fait. Il y a tout sauf le parametre "Rubriques=blablabla", forcément, car il échappe au masque. Comment l'ajouter ? :/


Message édité par ParadoX le 01-11-2005 à 04:07:23

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 01-11-2005 à 08:48:48    

En fait, il faudrait expliquer ce que tu voudrais réellement que te sortent les tableaux parce qu'entre :
 
Rubriques=Accessoire de gymnastique|Bricolage  
Rubrique:Nom=Accessoire de gymnastique  
RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique  
 
Ca fait quand même trois "syntaxes" différentes, que j'ai d'ailleurs un peu de mal à saisir. Bref, tu voudrais que ça te sorte quoi, tout ça ?
 
Ton

Citation :

$pattern_rubrique = '#Rubrique:([^=]*)=([^;]*)#';

ne te sort pas les RubriquesSuperieures parce que tu exiges un : après 'Rubrique'.


Message édité par sielfried le 01-11-2005 à 08:50:53

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

Marsh Posté le 01-11-2005 à 13:22:42    

Bon je me suis peut etre ma exprimé :)
 
Il s'agit d'extraire, du fichier .txt, tous les produits et toutes les rubriques. Une ligen commence soit par 'Produit:' ou par 'Rubrique:'.  
Alors je voulais faire une regex qui me sorte tous les attributs d'un produit, une regex qui me sorte tous les attributs d'une rubrique.
 
Tu m'as bien aidé avec  
 

Code :
  1. $pattern_produit = '#Propriete\(([^\)]*)\)=([^;]*)#';


 
qui me sort presque tous les attributs d'un produit, à savoir
 

Code :
  1. Array ( [0] => Libelle [1] => Prix [2] => UniteDeVente [3] => Photo )
  2. Array ( [0] => La barre de fer [1] => 29.90 [2] => l'unité [3] => barre_de_fer.jpg )


 
Est-il possible, dans cette meme regex, de lui faire également extraire le dernier attribut du produit qui est "Rubriques=", c'est à dire la rubrique à laquelle ce produit est subordonnée ? Que ça me donne qqch comme ça:
 

Code :
  1. Array ( [0] => Libelle [1] => Prix [2] => UniteDeVente [3] => Photo [4] => Rubriques )
  2. Array ( [0] => La barre de fer [1] => 29.90 [2] => l'unité [3] => barre_de_fer.jpg [4] => Accessoire de gymnastique|Bricolage )


 
Et du coup, j'aimerais aussi la même chose pour les rubriques.
 
J'obtiens, grace à ça:
 

Code :
  1. $pattern_rubrique = '#Rubrique:([^=]*)=([^;]*)#';
  2. $pattern_rubriquessuperieures = '#(RubriquesSuperieures)=([^\n\r]*)#';


 
ceci:
 

Code :
  1. Array ( [0] => Nom [1] => Nom )
  2. Array ( [0] => Accessoire de gymnastique [1] => Gymnastique )
  3. Array ( [0] => RubriquesSuperieures [1] => RubriquesSuperieures )
  4. Array ( [0] => Gymnastique|Accessoire [1] => Sport d'intérieur )


 
Maintenant, je voudrais groupe ces 2 regex pour obtenir le tout d'un coup, comme ça:

Code :
  1. Array ( [0] => Nom [1] => RubriquesSuperieures [2] => Nom [3] => RubriquesSuperieures )
  2. Array ( [0] => Accessoire de Gymnastique [1] => Gymnastique|Accessoire [2] => Gymnastique [1] => Sport d'intérieur )


 
C'est plus clair ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 01-11-2005 à 14:16:53    

RubriquesSuperieures=Gymnastique|AccessoireRubrique:Nom=Gymnastique;
 
Il manque pas un ; entre Accessoire et Rubrique ? Je pense que ça m'a un peu confusé, déjà... :/
 
Sinon, tes deux lignes n'ont pas la même forme, donc pourquoi essayer de les récupérer avec la même regexp ? Et quel intérêt surtout ?
 
Tu peux essayer quelque chose comme ça, m'enfin bon... :

Citation :


preg_match_all('#(Rubrique[^=]*)=([^;]*)#', $buffer, $matches);


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

Marsh Posté le 01-11-2005 à 15:01:26    

Bon jle fais en plusieurs fois, merci beacoup pour tout ça, tu m'as bcp aidé !
 
 :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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