Page 1 sur 1

PHP : passer un fichier dans une chaine

Publié : 22 mai 2005, 21:47
par calimo
Je cherche à faire passer le contenu d'un fichier dans une chaine. J'utilise la fonction file_get_contents :

Code : Tout sélectionner

$ecrire=file_get_contents($file);
Ça marche bien, la chaine prend le contenu exact du fichier. :)

Sauf que j'aimerais que ce fichier contienne des variables et que celles-ci soient remplacées par leurs valeurs... par exemple :

Code : Tout sélectionner

<body>
$contenu
</body>
J'aimerais que $contenu soit substitué à "$contenu"... pareil pour toutes les variables que contien(drai)t le fichier. Comment faire ? J'ai l'impression de partir complètement faux... quelqu'un a une idée ? Il y a surement une autre fonction que j'ai raté... :oops:

Publié : 22 mai 2005, 21:55
par Benoit
C'est la fonction include que tu as raté ? :)

(avec l'ouverture d'un buffer avant et sa fermeture après si tu veux que la sortie passe dans une chaîne et non à l'écran)

Publié : 22 mai 2005, 22:05
par calimo
Oui surement. J'ai essayé

Code : Tout sélectionner

$ecrire=include($file);
mais ça ne marche évidemment pas... ça retourne 1 (ou 0 je pense en fonction de si ça fonctionne ou pas). Quelle est la technique ?

Publié : 22 mai 2005, 22:11
par Benoit
Comme je viens de te le dire, avec ob_start() avant l'include, et puis $variable = ob_get_contents(). Il y a des exemples sur http://www.php.net/manual/fr/function.o ... ntents.php

Re: PHP : passer un fichier dans une chaine

Publié : 22 mai 2005, 22:37
par chBok
calimo a écrit :Sauf que j'aimerais que ce fichier contienne des variables et que celles-ci soient remplacées par leurs valeurs... par exemple :

Code : Tout sélectionner

<body>
$contenu
</body>
Si je comprends ta question, tu lis un fichier comme une chaine de caractères dans une variables, ensuite tu veux remplacer à l'intérieur de cette variable toutes les entrées $<qqc> qui sont elles mêmes des variables de ton script.

Aïe, j'ai mal aux cheveux. A moins de passer par des expressions régulières pour isoler les textes $<qqc>, puis de convertir leur contenu, puis de réinjecter dans la chaine initiale...

:!: Trouve autre chose :) surtout si c'est pour écrire une page Web.

Re: PHP : passer un fichier dans une chaine

Publié : 23 mai 2005, 08:35
par calimo
Benoit a écrit :Comme je viens de te le dire, avec ob_start() avant l'include, et puis $variable = ob_get_contents(). Il y a des exemples sur http://www.php.net/manual/fr/function.o ... ntents.php
Merci ! Ça marche... sauf que évidemment ce n'est pas interprété :oops:
chBok a écrit :Si je comprends ta question, tu lis un fichier comme une chaine de caractères dans une variables, ensuite tu veux remplacer à l'intérieur de cette variable toutes les entrées $<qqc> qui sont elles mêmes des variables de ton script.
Oui, je veux faire comme un include mais au lieu de l'écrire je voudrais que ça passe dans une variable pour faire un fwrite :mrgreen:
chBok a écrit :Aïe, j'ai mal aux cheveux. A moins de passer par des expressions régulières pour isoler les textes $<qqc>, puis de convertir leur contenu, puis de réinjecter dans la chaine initiale...

:!: Trouve autre chose :) surtout si c'est pour écrire une page Web.
Pour en revenir à ce que je disais hier soir, après investigation, le $ecrire=include($file) a un comportement bizarre.

Si je fais un echo($ecrire); la variable écrire contient bien ce que je veux, interprété comme je veux. Par contre... je ne comprend pas pourquoi quand je fais le fwrite ça m'écris juste "1"... quelle est la différence ? J'écris mon fichier avec

Code : Tout sélectionner

if (!$handle = fopen($filename, 'x+')) {
	echo "Impossible d'ouvrir le fichier ($filename)";
	exit;
}
if (fwrite($handle, $ecrire) === FALSE) {
	echo "Impossible d'écrire dans le fichier ($filename)";
	exit;
}
echo "L'écriture de (<pre>$ecrire</pre>) dans le fichier ($filename) a réussi";
fclose($handle);
J'y comprend rien :oops:

Re: PHP : passer un fichier dans une chaine

Publié : 23 mai 2005, 09:50
par chBok
calimo a écrit :[couic]Pour en revenir à ce que je disais hier soir, après investigation, le $ecrire=include($file) a un comportement bizarre.

Si je fais un echo($ecrire); la variable écrire contient bien ce que je veux, interprété comme je veux. Par contre... je ne comprend pas pourquoi quand je fais le fwrite ça m'écris juste "1"... quelle est la différence ?
La fonction fwrite te renvoie 1, qui correspond au nombre d'octet écrit :
fwrite retourne le nombre d'octets écrits ou FALSE en cas d'erreur.
Alors, pourquoi 1, simplement la valeur true affectée à ta variable $ecrire dans ton affectation avec include().

Ecrire $ecrire=include($file) n'est pas juste :!:

Re: PHP : passer un fichier dans une chaine

Publié : 23 mai 2005, 13:39
par calimo
chBok a écrit :Ecrire $ecrire=include($file) n'est pas juste :!:
Et pourtant ça marche dans un echo...

Il y a d'autres solutions ? Il va falloir que je regarde comment font des applications comme phpBB (ou peut-être des un peu plus simples :lol: j'ai juste besoin qu'il prenne un fichier et y ajoute quelques trucs)

Publié : 23 mai 2005, 14:18
par martin
Benoit et chBok t'ont donné la solution !

le fichier que tu traites ('inclus.php') :

Code : Tout sélectionner

<body>
<?php echo $contenu ?>
</body>
le fichier qui traite ('test.php');

Code : Tout sélectionner

<?php
$contenu ='mon machin';
ob_start();
$ecrire=include('inclus.php');
$monFichier=ob_get_clean();

echo $monFichier;
echo $ecrire;
?>
le contenu de la source générée est :

Code : Tout sélectionner

<body>
mon machin</body>
1
Si 'echo $ecrire;' te rencoie vraiment autre chose que 1, c'est un bug de la version que tu utilises ! Personnellement php 5.0.4 me renvoie bien 1.

Publié : 23 mai 2005, 14:25
par martin
juste, je précise que "$ecrire=include('inclus.php'); " n'était là que pour l'exemple, "include 'inclus.php'" est amplement suffisant, voire include_once ou require_once.

Publié : 23 mai 2005, 18:56
par calimo
Ça marche !
Je dois avouer que je n'avais pas tout à fait saisi cette histoire de "buffer", et j'avais raté la fonction ob_get_clean() qui rend les choses nettement plus concrètes :wink:

Merci à tous, c'est pile-poil ce que je voulais, je peux même faire d'autres includes dans le fichier inclus, parfait :lol: :wink: