Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1495 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1234510
ParadoX
Posté le 30-10-2005 à 16:11:49  profilanswer
 


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
mood
Publicité
Posté le 30-10-2005 à 16:11:49  profilanswer
 

n°1234522
sielfried
Posté le 30-10-2005 à 16:57:12  profilanswer
 

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
n°1234525
ParadoX
Posté le 30-10-2005 à 17:03:51  profilanswer
 

'vais tenter, merci déja :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1234566
ParadoX
Posté le 30-10-2005 à 18:59:29  profilanswer
 

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
n°1234634
sielfried
Posté le 30-10-2005 à 22:03:05  profilanswer
 

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
n°1234640
ParadoX
Posté le 30-10-2005 à 22:15:56  profilanswer
 

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
n°1234645
sielfried
Posté le 30-10-2005 à 22:24:31  profilanswer
 

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
n°1234646
ParadoX
Posté le 30-10-2005 à 22:32:49  profilanswer
 

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
n°1234647
sielfried
Posté le 30-10-2005 à 22:36:28  profilanswer
 

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
n°1235200
ParadoX
Posté le 31-10-2005 à 17:19:24  profilanswer
 

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
mood
Publicité
Posté le 31-10-2005 à 17:19:24  profilanswer
 

n°1235250
ParadoX
Posté le 31-10-2005 à 17:50:52  profilanswer
 

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
n°1235305
sielfried
Posté le 31-10-2005 à 18:48:58  profilanswer
 

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
n°1235331
ParadoX
Posté le 31-10-2005 à 19:29:13  profilanswer
 

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
n°1235341
sielfried
Posté le 31-10-2005 à 19:48:57  profilanswer
 

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
n°1235357
ParadoX
Posté le 31-10-2005 à 20:15:33  profilanswer
 

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


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1235442
ParadoX
Posté le 31-10-2005 à 23:39:29  profilanswer
 

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
n°1235470
ParadoX
Posté le 01-11-2005 à 03:51:03  profilanswer
 

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
n°1235477
sielfried
Posté le 01-11-2005 à 08:48:48  profilanswer
 

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
n°1235617
ParadoX
Posté le 01-11-2005 à 13:22:42  profilanswer
 

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
n°1235663
sielfried
Posté le 01-11-2005 à 14:16:53  profilanswer
 

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
n°1235693
ParadoX
Posté le 01-11-2005 à 15:01:26  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Recherche avec résultat instantanéRecherche du maximum d une liste de nombres[resolu]
effectuer une recherche et copier au passageAller à la derniere ligne d'un fichier texte et recherche chaine
à propos de cadres.. ou recherche d'une autre solution[java] Recherche un "FileSelectPopup"
Résolu : Recherche des doublons dans la base.Probleme avec les expressions regulieres
Arbre Binaire de Recherche générique 
Plus de sujets relatifs à : Expressions régulières, recherche ds un .txt


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR