[Résolu] remplacer le début d'un fichier

Petit nouveau ! | 8 Messages

16 mai 2009, 22:42

Bonjour,

Je me heurte à un problème qui ressemble à un problème de débutant mais... je commence pourtant à me débrouiller normalement :oops:

J'écris la config d'une appli dans un fichier. Cette config est un tableau, écrit grace à la fonction var_export(). Le hic, c'est que la config ne fait pas toujours le même nombre de lignes, et encore moins de caractères. Du coup le plus simple serait de réserver une trentaine de lignes pour l'écrire. Mais si je vois très bien comment écrire des lignes, je ne trouve rien d'efficace pour "effacer" car la fonction fputs() ajoute en insertion.

Mon dernier essai aura été le suivant :
<?php
	$text = "<?php\n".'$config = '. var_export($new_config, true) . ';' ;// la config est là

	$text .= file_get_contents ("restore.php", $offset= -500); // ajoute le reste du fichier

	file_put_contents('restore.php', $text); // remplace le tout dans le fichier

?>
J'ai aussi touillé du côté de file() et fputs() mais sans succès...

Vous feriez comment ? :?:
Modifié en dernier par neeteex le 17 mai 2009, 11:41, modifié 2 fois.

ViPHP
ViPHP | 2287 Messages

16 mai 2009, 22:49

Soit tu réécris tout le fichier, soit tu poses dans ton fichier des balises qui te serviront à marquer l'espace effaçable, que tu attraperas via une expression régulière.

Attention au choix des balises cependant, il ne faudrait pas qu'elles se retrouvent au milieu de ton tableau généré ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 8 Messages

17 mai 2009, 10:22

Le problème, c'est que je n'ai pas encore trouvé le moyen d'effacer simplement.

Encore un essai brutal et infructueux :
	$restore = fopen('restore.php', 'r+');
	$tab=file('restore.php');  // récupère le contenu
	file_put_contents('restore.php', $text); // efface le fichier pour mettre la config seulement
	
	fseek ($restore, 0, SEEK_END) ; // place le pointeur à la fin

	for ($i = 50 ;  $i<1050 ; $i ++ ) // écrit 1000 lignes à partir de la ligne 50
		 fputs ($restore, $tab[$i]) ;

	fclose($restore);
Je vais faire un nouveau test avec preg_replace, que je mettrai ici.

EDIT :

EXCELLENT,

Après bien des essais j'ai construit ma regex en utilisant un commentaire :
$text = "<?php\n".'$config = '. var_export($new_config, true) . ";//config file should not be changed manually ?>" ;

$subject = file_get_contents ('restore.php') ;
$replacement = $text;
$pattern = "#^<\?php.*;//config file should not be changed manually \?>#s"; 

$restore = preg_replace ($pattern, $replacement, $subject, $limit=1); // remplacement
file_put_contents('restore.php', $restore); // écrit le tout dans restore.ph
Résolu, merci Calimero :D