[Résolu] PHP et expressions régulières - Analyse de bloc de données

Bonjour à vous,

je viens vers vous car je rencontre un petit problème. Pour les besoins d’un soft, j’ai besoind d’analyser un fichier contenant des données organisées en bloc de type :

nom_données {
param=valeur

toto=valeur

paramX=valeurX
}

Sachant que le nombre de paramètres est variable, mais que la paramètre "toto" est toujours là avec une valeur variable.

Je cherche donc une expression régulière permettant de récupérer le nom du bloc de donnée ainsi que la valeur du paramètre "toto".

Y aurait-il un dieu des expressions régulières pour m’aider??

Merci par avance.

Archange76

euhh tu veux faire ca en php?
je resume la chose pour la comprehension ^^’
sinon si je fait un truc et que c’etait pas ca ca serais balo =)

alors une page php,
celle ci analyse le fichier de données
et modifie le parametre toto= X
en toto = Y
auparavant on a entré la nouvelle valeur X de toto
c’est bien ca?

Tout d’abord merci de t’interressé au problème.

Tu as bien fait de résumer la chose ^^

En fait, je ne veux modifier aucune valeur. Je veux juste récuperer le nom du bloc et la valeur d’un parametre défini dont la nom est constant.

Par exemple :


bloc1 {
param1=valeur1
param2=valeur2
toto=aaa
param4=valeur4
}

bloc2 {
param1=valeur1
param2=valeur2
toto=bbb
param4=valeur4
}

Une fois ce fichier analysé, j’aurais un tableau contenant les valeurs suivantes :
array( [0] => array( [0] => bloc1, [1] => aaa) , [1] => array( [0] => bloc2, [1] => bbb))

Si tu as des questions hésite pas

Merci

Archange76

Tu peux tenter un truc pour peu que la valeur ne contienne pas { ou } : preg_replace_callback

dans un premier temps tu recherches le premier pattern (/([^{\s]+)\s*\{([^}])\}/) puis sur la chaîne $2, tu peux appliquer le second : /([^\s=]+)\s=\s*(.*)$/

(sinon tu as plus vite fait de faire ton parser, ou repenser ta structure, tu peux faire du ini par exemple, ça sera plus simple)

Je ne peux pas modifier ma structure de fichier car l’appli qui genere ce fichier, je ne la controle pas…

J’ai donc besoin d’une expression régulière permettant de parser le fichier complet contenant un nombre non connu de bloc de données

je pense que si tu traite le fichier avec la fonction parse_ini_file , vu qu’il a la structure d’un ini, ca pourrais ptete marcher, enfin a tester

sinon ca va faire lourd mais faut voir le principe

ouvrir le fichier, le parcourir,
recuperer les données,
les mettre dans un tableau assoc…
mhmm

Dans ce cas : tu peux faire un parser très simple avec pour token :

ID : identifiant (avant {)
{
}
DEF : nom=valeur

En gros : tu as une fonction lex() qui te renvoie les tokens, un à un, l’algo consiste à appliquer une série de regexp, et de prendre celle qui matche la plus longue chaîne.

Ensuite :

if (lex() == ID && lex() == '{') {
  while ($lex() != '}') {
     echo $value[0], '=', $value[1];
  }
} else echo 'erreur';

Fin.

Alors non cela ne fonctionne pas avec la fonction parse_ini_file… dommage :confused:

Va falloir que je trouve cette $%$ù d’expression régulière…

Merci de votre aide en tout cas

Puisque je te dis qu’il n’y en a pas… Une expression régulière a ses limites.

Passé les regexp (automates), faut passer aux grammaires (transducteur si je me plante pas) où tu peux avoir une notion de contexte (ici le bloc parent).

Vous allez me prendre pour un bourrin mais moi je remplacerais simplement "bloc1 {"
par "[bloc1]", avant de supprimer les "}" de fin de bloc. Et enfin un parse_ini_file et le tour est joué.

oui aussi. Mais comme on sait rien sur la valeur, il se passe quoi si on retrouve ça ailleurs ? :slight_smile:

On espère pour lui que c’est des clés uniques…

Ouaip :slight_smile: mais je pensais si le motif est présent ailleurs?

A lui de voir, tu fais bien de l’indiquer en effet.
Mais bon, vaut mieux qu’il est une solution potentielle facile avant de réfléchir à beaucoup plus long à mettre en place.

Ben un parser c’est facile :slight_smile: dans ce que j’ai écris, faut juste faire la fonction lex() à cause de regexp.

Ouais mais se mettre à l’analyse syntaxique pour quelqu’un qui n’en a jamais fait…
Et en php, pour utiliser lex et yacc ou bison, y a rien de natif, il faut faire appel à du code externe (en C par exemple) avec des exec ou autre.

?? mon code n’implique pas bison & flex hein :slight_smile:

(et puis, j’ai quand même fait un squelette bison en php :p)

Merci à vous pour toutes vos réponses mais je me suis fait un petit bout de code en php avec deux boucles et ca marche bien :slight_smile:

Archange76