Expressions régulières

Eléphanteau du PHP | 11 Messages

23 févr. 2009, 18:56

Salut à tous !!!

Et oui encore un nième problème d'expression régulière. Je vous expose mon problème et le contexte dans lequel je souhaite le mettre en oeuvre, j'espère d'une part que vous pourrez m'éclairer sur ce qui cloche mais aussi avoir votre avis sur la méthode que j'utilise pour arriver à mes fins. J'ai eu beau écumer les forums je n'ai pas trouvé plus simple, ce qui m'étonne pas mal.

Je souhaite mettre au point un formulaire qui chargera les valeurs de mes variables contenu dans le fichiers variables.inc.php dont voici un exemple :

Code : Tout sélectionner

$Gconf['sql']['base']='mabase';//1 $Gconf['sql']['host']='adr.serveur.sql';//2 $Gconf['sql']['login']='monlogin';//3 $Gconf['sql']['pass']='monpass';//4
Le formulaire permettra par la suite de modifier les données puis de les réinjecter dans le fichier.
<?php
      // Lecture du fichier d'aministration
      $fichier = "variables.inc.php";
      if (file_exists($fichier)) {
        if ($tableau = file($fichier)) {
          while(list(,$val)=each($tableau)){
            // ligne de commentaire
            if (substr($val, 0, 2)!=="<?"){
              if (substr($val, 0, 2)=="//"){
                echo $val, '<br />';
              }
              else{
                // Ligne de variable
                // Echappement de tout les caractères spéciaux  ^ . [ ] $ ( ) * + ? | { } \ 
                if(ereg('([0-9A-Za-z \[\]\"\'\.\$_@]*)=\'?([0-9a-zA-Z.]*)\'?;//([0-9a-zA-Z. \'\"]*)', $val, $regs ) ) {  
                    echo "<b>", $regs[1], " ", $regs[2], " ", $regs[3], '</b><br />';  
                }else{  
                    echo "Chaine non reconnue.", '<br />';  
                }
              }
            }
          }
        }
        else {echo "Erreur, le fichier n'a pas pu être ouvert.";}
      } 
      else {echo "Fichier introuvable !";}
?>

Mon souci c'est que mon ereg ne me retrouve pas la première partie de la chaine :

Code : Tout sélectionner

$Gconf['sql']['base']
Si quelqu'un pouvez me filer un petit coup de main j'en serais ravi, je suis dessus depuis ce midi et je commence à saturer !!!

Dans un second temps si vous connaissez un façon plus simple de faire ce que je veux à savoir charger modifier enregistrer des variables globales pour le site, je suis également preneur !

Merci d'avance pour votre aide.
Stéphane

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 févr. 2009, 19:53

En solution plus simple, pour la lecture, pourquoi ne pas utiliser un include pour importer le fichier et faire une boucle sur le tableau $Gconf afin d'en lister les clés et les valeurs ? (bon si vraiment tu veux faire ça proprement, la lecture et le parsing du fichier sont effectivement plus jolis :) Préfère alors un preg_match() à ereg() et simplifie ton masque, surtout si les 2 données qui t'intéressent ne sont que la clé et la valeur : "#\['(.*)'\]='(.*)';#Ui" )

Tu proposes à partir de là un formulaire avec chaque couple clé/valeur, l'utilisateur pouvant modifier les valeurs.

Enfin pour l'enregistrement, au lieu de t'embêter à modifier ton fichier, tu peux simplement le réécrire complètement à chaque fois, à partir des variables et valeurs récupérées du formulaire :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 3607 Messages

23 févr. 2009, 20:04

et avec serialize() et unserialize()?
tu crées un tableau général (içi ton $Gconf) et pour le sauvegarder dans ton fichier:
<?php
//lecture de $Gconf:
$Gconf=unserialize(file_get_contents($fichier));


//modification de $Gconf
//...

//sauvegarde:

file_put_contents($fichier,serialize($Gconf));

?>
Voilou je suis pas très sûr que ça marche du premier coup ;) mais ça me parait plus simple comme solution.. non?
D'autant plus que ça te permet une plus grande souplesse pour rajotuer des entrées dans ton tableau etc...

Sinon pour faire encore plus propre, tu as des types de fichiers de données plus adaptés pour la conservation de données de configuration...: au hasard:
Json,Yaml,Xml,Conf, etc...

Invité
Invité n'ayant pas de compte PHPfrance

23 févr. 2009, 23:53

En solution plus simple, pour la lecture, pourquoi ne pas utiliser un include pour importer le fichier et faire une boucle sur le tableau $Gconf afin d'en lister les clés et les valeurs ? (bon si vraiment tu veux faire ça proprement, la lecture et le parsing du fichier sont effectivement plus jolis :) Préfère alors un preg_match() à ereg() et simplifie ton masque, surtout si les 2 données qui t'intéressent ne sont que la clé et la valeur : "#\['(.*)'\]='(.*)';#Ui" )

Tu proposes à partir de là un formulaire avec chaque couple clé/valeur, l'utilisateur pouvant modifier les valeurs.

Enfin pour l'enregistrement, au lieu de t'embêter à modifier ton fichier, tu peux simplement le réécrire complètement à chaque fois, à partir des variables et valeurs récupérées du formulaire :)
Merci à tout deux pour vos réponses rapide.
Je me suis remis sur mon code et je dois dire que ça n'avance pas trop, j'utilise donc le preg_match() avec l'expression régulière que Ryle m'a donné et que j'ai un peu reprise voici :
"#([^\f\n\r\t\v]*)'\]='(.*)';//(.*)$#Ui"
du coup j'arrive à obtenir ça mais mon optimisation s'arrête là:

Code : Tout sélectionner

$Gconf['webmaster // pour $Gconf['webmaster']
Je récupère correctement le reste de mes infos

Le truc que je ne comprends pas, c'est que si la premier parti de ma chaine contient les lettre "uivi" le nom de la variable que je récupère est tronqué :

Exemple j'obtiens:
iCde // pour $Gconf['SuiviCde']
ou encore
i_cmd // pour $Gconf['suivi_cmd']
Je ne maitrise toujours pas les expressions régulières bien que je me documente pas mal, je ne parviens pas à trouver un site qui détaille vraiment bien les options, je ne comprends notamment pas dans l'expression régulière que j'utilise les options Ui.

Merci d'avance pour vos réponses!!

@+
Stéphane

Invité
Invité n'ayant pas de compte PHPfrance

23 févr. 2009, 23:58

et avec serialize() et unserialize()?
tu crées un tableau général (içi ton $Gconf) et pour le sauvegarder dans ton fichier:
<?php
//lecture de $Gconf:
$Gconf=unserialize(file_get_contents($fichier));


//modification de $Gconf
//...

//sauvegarde:

file_put_contents($fichier,serialize($Gconf));

?>
Voilou je suis pas très sûr que ça marche du premier coup ;) mais ça me parait plus simple comme solution.. non?
D'autant plus que ça te permet une plus grande souplesse pour rajotuer des entrées dans ton tableau etc...

Sinon pour faire encore plus propre, tu as des types de fichiers de données plus adaptés pour la conservation de données de configuration...: au hasard:
Json,Yaml,Xml,Conf, etc...
Pour les formats de fichier que tu évoques, j'y ai bien pensé mais mon but reste quand de conserver un fichier php que j'utilise en faisant un include dans mon index principal. Alors à moins que ça soit faisable par un moyen que je ne connais pas, je n'ai pas trop le choix.

Pour ce qui est du serialize() et unserialize(), je m'y plonge !!!

Merci encore !

Eléphant du PHP | 185 Messages

24 févr. 2009, 16:32

include() et var_export() sinon... Faut juste faire gaffe à la sécu avec le include() (bien contrôler le contenu du fichier et les entrées de l'utilisateur pour ne pas pouvoir injecter de PHP dedans).

Eléphanteau du PHP | 11 Messages

25 févr. 2009, 15:33

J'ai fini par trouver exactement ce que je voulais dans un ancien post de naholyr
<?php 

// Charger la config
include 'config.php';

// Modifier la config
$config['variable1'] = 'Marcel';

// Sauvegarder la config
$configTxt = '<'.'?php $config = ' . var_export($config, true) . '; ?'.'>'; // Nouveau contenu
copy('config.php', 'config.php-bak'.date('YmdHis')); // Sauvegarde de l'ancien
file_put_contents('config.php', $configTxt); // Ecriture du nouveau 
?>
http://www.phpfrance.com/forums/voir_reponse-280670.php