Supprimer une ligne dans un fichier avec php

Fermé
jb1993 Messages postés 85 Date d'inscription dimanche 17 août 2008 Statut Membre Dernière intervention 7 septembre 2011 - 7 mai 2009 à 13:03
jb1993 Messages postés 85 Date d'inscription dimanche 17 août 2008 Statut Membre Dernière intervention 7 septembre 2011 - 7 mai 2009 à 21:41
Bonjour,
je suis en train de crée une mini-bibliothèque en php permettant de gérer plus simplement un style de fichier en .zfl. Le but de ce nouveau petit langage est de simplifier les constantes en les rendant simple d'accès sans avoir tout les d'inconvénients de la gestion des fichiers en php.

Néanmoins, une erreur commence à détruire tout mon projet. Supprimer une ligne ou modifier la valeur. Les données sont sauvegarder de la sorte dans le fichier .zfl
Clef:Valeur
Clef2:Valeur2
Néanmoins, même avec toute la documentation utiliser je ne réussis pas à trouver de fonction pour supprimer entièrement une ligne ou simplement modifier une valeur en évitant qui mettes à la place une valeur NULL. La source de la fonction :

function zfiles_erase($nom, $files)
{
	$trouver = true;
	if(isset($files))
	{
		do
		{
			$ligne = explode(':', fgets($files));
			if($ligne[0] == $nom)
			{
				fseek($files, 0);
				fputs($files, 'Delete line');
				
				echo "<br />Ligne supprimer.";
				
				$trouver = false;
			}
			elseif($ligne[0] == NULL)
			{
				echo "<br />Paramètre non existant.";
				$trouver = false;
			}
		}
		while($trouver);
	}
	else
	{
		echo "<br />Aucun fichier ouvert.";
	}
}


Comme précisions : $files est le fichier à modifier et $nom est la clef à supprimer. J'ouvre les fichiers avec l'attribue a+ ou x+. Pour le problème, il m'ajoute simplement à la fin du fichier "Delete line".
Cordialement, jb1993.
A voir également:

4 réponses

P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
7 mai 2009 à 15:18
Utilise une expression rationnelle, de façon à obtenir par exemple :
function zfiles_erase($nom, $fichier)
{
   if( !is_file($fichier) )
      trigger_error('Fichier ' . $fichier . 'inexistant', E_USER_WARNING);
   else
   {
      $listeValeur = file_get_contents($fichier);
      if( ($changement = preg_replace('#\r?\n' . $nom . ':.+#Us', '', $listeValeur)) != $listeValeur )
         if( file_put_contents($fichier, $changement) )
            return true;
      return false;
   }
}

var_dump(zfiles_erase('machin', 'erase.txt'));
À améliorer, mais l'idée est là.
1
jb1993 Messages postés 85 Date d'inscription dimanche 17 août 2008 Statut Membre Dernière intervention 7 septembre 2011 3
7 mai 2009 à 15:40
Il y a des choses que je ne comprend pas :

$listeValeur = file_get_contents($fichier);
if( ($changement = preg_replace('#\r?\n' . $nom . ':.+#Us', '', $listeValeur)) != $listeValeur )
        if( file_put_contents($fichier, $changement) )
                return true;
return false;


Fonction que je ne connais pas :
file_get_contents()
file_put_contents()

Et surtout le regex spécial, que fait-il exactement ?... vous pouvez m'expliquer le code de celui-ci ? ^^'
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
7 mai 2009 à 19:45
Bah pour les fonctions, un petit tour vers la doc php ;)

Le pattern de l'expression rationnelle signifie que l'on remplace la chaine contenue dans $nom située en début de nouvelle ligne ( \r?\n ), le \r? c'est pour windows, le ? signifiant qu'il est optionnel, suivie de : donc, lui meme suivi de n'importe quel caractères (.+).
Les options (Us) signifiant que l'on inverse la tendance à la gourmandise (U), le s quand à lui signifie que le . (.+) ne doit pas prendre en compte les caractères de nouvelles ligne.

[EDIT]

Après lecture de ton mp, j'ai en effet omit le début du fichier, il faut donc remplacer le masque du preg_replace() par #(?:^|\r?\n' ). $nom . ':.+#Us
0
jb1993 Messages postés 85 Date d'inscription dimanche 17 août 2008 Statut Membre Dernière intervention 7 septembre 2011 3
7 mai 2009 à 21:41
J'ai une erreur à la ligne :
if( ($changement = preg_replace('#(?:^|\r?\n' ). $nom . ':.+#Us', '', $listeValeur)) != $listeValeur )

Parse error: parse error in D:\wamp\www\teste\index.php on line 8
0