PHP - Extraire des binds d'un fichier cfg/ini

Discussion dans 'Web, design' créé par Carambar, 12 Janvier 2005.

Statut de la discussion:
Fermée.
  1. Offline
    Carambar He once forgot how to cry
    Je voudrais savoir comment procéder pour isoler une ligne dans un fichier ini (un fichier texte utilisé par un jeu vidéo pour la config) pour ensuite en extraire un bind et le charger dans une variable. Des exemples de code serais le bienvenu :) .
    Carambar, 12 Janvier 2005
    #1
  2. Offline
    null ose();
    Donc par exemple, les personnes uploadent un .cfg et ton script doire le lire et prendre toutes les lignes où il y a un bind ?

    <?php
    $fp = fopen($file,"rb");
    $data = fread($fp, filesize($file));
    fclose($fp);

    $data = explode("\n", $data);

    foreach($data as $line)
    {
    \\ vérification par exepression réguilère

    }
    ?>
    null, 12 Janvier 2005
    #2
  3. Offline
    Carambar He once forgot how to cry
    Pas mal ca :D . C'est à peu près ce que je voulais. Je pourrais peut être utiliser un explode pour extraire le bind après le signe = dans les fichiers ini de UT.
    Carambar, 12 Janvier 2005
    #3
  4. Offline
    guslinux Gamerz'ien
    ya moyen de lire ligne par ligne aussi ... c pe plus adapté ...
    guslinux, 12 Janvier 2005
    #4
  5. Offline
    Carambar He once forgot how to cry
    Comment est-ce qu'on procéde pour ligne par ligne, dis moi ?
    Carambar, 12 Janvier 2005
    #5
  6. Offline
    guslinux Gamerz'ien
    guslinux, 12 Janvier 2005
    #6
  7. Offline
    Carambar He once forgot how to cry
    Ah, ca me rapelle mes cours de C ca. Merci :p .
    Carambar, 13 Janvier 2005
    #7
  8. Offline
    guslinux Gamerz'ien
    bein le PHP est dérivé du c hein ...
    guslinux, 14 Janvier 2005
    #8
  9. Offline
    Carambar He once forgot how to cry
    Oui je sais mais le nom des instructions ainsi que l'aspect du code fais vraiment penser au C :p . Voici une petite modification en vitesse pour charger le fichier dans une matrice :

    Code:
    <?php
    $fd = fopen ("user.ini", "r");
    $compteur=0;
    while (!feof ($fd)) {
    $compteur++;
    $ini[$count] = fgets($fd, 4096);
    }
    echo ('<pre>'); print_r($ini);
    fclose ($fd);
    ?>
    L'utilisation de la variable compteur n'est pas très élégante mais ca marche. Voici ce que ca donne avec un fichier User.ini de Unreal Tournament :

    Et ainsi de suite. Une petite amélioration consisterais à ne pas prendre en compte les lignes à blanc. Ensuite, ce que je vais faire c'est utiliser la fonction explode pour scinder chaque ligne en touche et commande, le but final étant d'afficher ca sur une page avec des champs.
    Carambar, 10 Février 2005
    #9
  10. Offline
    Carambar He once forgot how to cry
    Voici une fonction assez élégante qui tiens compte de l'encodage du fichier, qu'il soit Windows/Unix/Mac :

    Code:
    function fileread($filename) {
           $fp = fopen($filename, "rb");
           $buffer = fread($fp, filesize($filename));
           fclose($fp);
           $lines = preg_split("/\r?\n|\r/", $buffer);
           return $lines;
    }
    echo ('<pre>'); print_r(fileread("user.ini"));
    
    Edit :

    Code:
    $fd = fopen ("user.ini", "r");
    $compteur=0;
    while (!feof ($fd)) {
    	$compteur++;
    	$ligne = str_replace("\n",'',fgets($fd,200));
    	if ($ligne != "") $ini[$compteur] = $ligne;
    	}
    echo ('<pre>'); print_r($ini);
    fclose ($fd);
    ?>
    Ce code semble bien fonctionner mais je ne comprends pas pourquoi il affiche encore des lignes blanches.

    Edit :

    J'ai trouvé ce qui n'allais pas. Je me suis souvenu que Windows encode les fichiers textes avec un retour un ligne et puis un linefeed. Le script suivant se débarrasse des lignes blanches mais n'est pas multiplateforme.

    Code:
    <?php
    $fd = fopen ("user.ini", "r");
    $compteur=0;
    while (!feof ($fd))
    {
    	$ligne = str_replace("\r\n",'',fgets($fd,200));
    	if($ligne != "")
    	{
    		$compteur++;
    		$ini[$compteur]=$ligne;
    	}
    }
    echo ('<pre>'); print_r($ini);
    fclose ($fd);
    ?>
    Carambar, 10 Février 2005
    #10
  11. Offline
    j0k3r_n0ir ex membre
    Pourquoi faire compliqué quand on peut faire simple ...
    T'as fonction ne traitera que des fichiers .ini ?

    Et bien utilise tout simplement la fonction php parse_ini_file.

    Elle te renvoie un joli tableau assossiatif, très facile a utiliser.
    j0k3r_n0ir, 10 Février 2005
    #11
  12. Offline
    Carambar He once forgot how to cry
    J'y avais pensé mais la structure d'un fichier ini pour UT/UT2004 n'est pas tout à fait conforme. En somme je vais devoir un peu réinventer la roue :p .

    Code:
    <?php
    @$ini = parse_ini_file("user.ini", TRUE); // donne une erreur
    echo ('<pre>'); print_r($ini);
    ?>
    Donne ca (seulement le début a été traité) :

    Si près du but et pourtant si loin :D.
    Carambar, 10 Février 2005
    #12
  13. Offline
    Carambar He once forgot how to cry
    J'y suis finalement arrivé :p . Pour ceux que ca intéresse, il est possible de créer des tableaux associatifs en utilisant des variables. A partir de là c'est une question de repérer les binds simples en utilisant la fonction count.
    Carambar, 10 Février 2005
    #13
  14. Offline
    null ose();
    Fait :

    Code:
    //...
    if(strlen(trim($ligne)) == 0)
    //..
    
    Function Trim(), en gros s'il y a un espace ou un caractère de tabulation, etc, il serait supprimé pour le test
    null, 10 Février 2005
    #14
  15. Offline
    Carambar He once forgot how to cry
    Merci :) . Je vais modifier ca. Une fois que j'aurais mis le script au point, je mettras ca en ligne pour qu'on puisse le tester. Voici le résultat auquel je suis arrivé actuellement.

    Carambar, 10 Février 2005
    #15
  16. Offline
    j0k3r_n0ir ex membre
    Han UT ne donne même pas de fichier ini valide ... pff :roll:
    j0k3r_n0ir, 10 Février 2005
    #16
  17. Offline
    Carambar He once forgot how to cry
    En fait, la fonction parse_ini_file() peut traiter des fichiers ini formatté de la manière suivante :

    Là où ca coince c'est au niveau des lignes définissant des alias :

    Comme tu peut le voir, il y a plusieurs fois le signe égal, ce qui est sans doute la raison pour laquelle la fonction produit des erreurs. Ce qu'il faudrais c'est réécrire la fonction de sorte qu'elle prenne en compte le premier signe égal et qu'elle considère le restant de la ligne comme étant une valeur.
    Carambar, 11 Février 2005
    #17
  18. Offline
    j0k3r_n0ir ex membre
    Ouep ... php est en open source ... allé on mets les mains dans le code :p
    j0k3r_n0ir, 11 Février 2005
    #18
Statut de la discussion:
Fermée.