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

Statut
N'est pas ouverte pour d'autres réponses.

Carambar

Elite
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 :) .
 

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

}
?>
 
1er
OP
Carambar

Carambar

Elite
null a dit:
$data = explode("\n", $data);
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.
 

guslinux

Gamerz'ien
null a dit:
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

}
?>
ya moyen de lire ligne par ligne aussi ... c pe plus adapté ...
 
1er
OP
Carambar

Carambar

Elite
Comment est-ce qu'on procéde pour ligne par ligne, dis moi ?
 
1er
OP
Carambar

Carambar

Elite
Ah, ca me rapelle mes cours de C ca. Merci :p .
 
1er
OP
Carambar

Carambar

Elite
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 :

Array
(
[1] => [DefaultPlayer]

[2] => Name=Azura

[3] => Class=BotPack.TFemale1

[4] => team=1

[5] => skin=FCommandoSkins.aphe

[6] => Face=FCommandoSkins.Indina

[7] => OverrideClass=

[8] => Voice=BotPack.VoiceMaleTwo

[9] =>

[10] => [Engine.Input]

[11] => Aliases[0]=(Command="Button bFire | Fire",Alias=Fire)

[12] => Aliases[1]=(Command="Button bAltFire | AltFire",Alias=AltFire)

[13] => Aliases[2]=(Command="Axis aBaseY Speed=+300.0",Alias=MoveForward)

[14] => Aliases[3]=(Command="Axis aBaseY Speed=-300.0",Alias=MoveBackward)

[15] => Aliases[4]=(Command="Axis aBaseX Speed=-150.0",Alias=TurnLeft)

[16] => Aliases[5]=(Command="Axis aBaseX Speed=+150.0",Alias=TurnRight)

[17] => Aliases[6]=(Command="Axis aStrafe Speed=-300.0",Alias=StrafeLeft)

[18] => Aliases[7]=(Command="Axis aStrafe Speed=+300.0",Alias=StrafeRight)
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.
 
1er
OP
Carambar

Carambar

Elite
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.

Array
(
[1] => [DefaultPlayer]
[2] => Name=Azura
[3] => Class=BotPack.TFemale1
[4] => team=1
[5] => skin=FCommandoSkins.aphe
[6] => Face=FCommandoSkins.Indina
[7] => OverrideClass=
[8] => Voice=BotPack.VoiceMaleTwo
[9] =>
[10] => [Engine.Input]
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);
?>
 
J

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.
 
1er
OP
Carambar

Carambar

Elite
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é) :

Array
(
[DefaultPlayer] => Array
(
[Name] => Azura
[Class] => BotPack.TFemale1
[team] => 1
[skin] => FCommandoSkins.aphe
[Face] => FCommandoSkins.Indina
[OverrideClass] =>
[Voice] => BotPack.VoiceMaleTwo
)

[Engine.Input] => Array
(
)

)
Si près du but et pourtant si loin :D.
 
1er
OP
Carambar

Carambar

Elite
J'y suis finalement arrivé ^^ . 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.
 

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
 
1er
OP
Carambar

Carambar

Elite
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.

Array
(
[0] => Array
(
[Name] => Azura
)

[1] => Array
(
[Class] => BotPack.TFemale1
)

[2] => Array
(
[team] => 1
)

[3] => Array
(
[skin] => FCommandoSkins.aphe
)

[4] => Array
(
[Face] => FCommandoSkins.Indina
)

[5] => Array
(
[OverrideClass] =>
)

[6] => Array
(
[Voice] => BotPack.VoiceMaleTwo
)

[7] => Array
(
[LeftMouse] => AltFire
)

[8] => Array
(
[RightMouse] => Jump
)

[9] => Array
(
[MiddleMouse] =>
)

[10] => Array
(
[Tab] => Type
)
(etc.)
 
J

j0k3r_n0ir

ex membre
Han UT ne donne même pas de fichier ini valide ... pff :roll:
 
1er
OP
Carambar

Carambar

Elite
En fait, la fonction parse_ini_file() peut traiter des fichiers ini formatté de la manière suivante :

[Section1]
Nomvaleur=Valeur

[Section2]
Nomvaleur2=Valeur2
Là où ca coince c'est au niveau des lignes définissant des alias :

[Engine.Input]
Aliases[0]=(Command="Button bFire | Fire",Alias=Fire)
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.
 
J

j0k3r_n0ir

ex membre
Ouep ... php est en open source ... allé on mets les mains dans le code ^^
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut