Salut tout le monde !
J'ai besoins de créer une fonction PHP qui agisse comme un preg_replace, mais dans un fichier texte préalablement ouvert en mode r+ (lecture et écriture). J'ai cherché un peu sur Google et sur ce forum, et je n'ai rien trouvé..
Il se trouve que j'ai deux gros problèmes dans la conception de ma fonction :
Le premier est au niveau des CHMOD. A chaque fois que j'upload mon fichier texte dans lequel je vais effectuer mon preg_replace, les droits d'accès redeviennent 0644. Or pour que ma fonction puisse écrire dans le fichier, je voudrais mettre les droits d'accès du fichier à 0666, puis les remettre à 0644 à la fin de ma fonction. Mais j'obtiens des Warnings du genre :
Warning: chmod(): Operation not permitted in /home/www/...../tools/files.class.php on line 61
Pourtant je suis les recommandations de l'aide technique de mon hébergeur.
Mon deuxième problème est au niveau de l'algorithme. Ma fonction a l'air de fonctionner, uniquement pour un fichier d'une seule ligne, et seulement lorsque la chaine qui remplace est plus longue que la chaine qu'on remplace.
Il y a donc deux problèmes dans l'algorithme :
- Si le mot qui remplace est plus court : dans ce cas, je vais essayer de faire une fonction qui supprime la chaine à remplacer, puis qui replace le curseur à l'endroit où on va insérer la chaine.
- S'il y a plusieurs lignes dans le fichier texte : je ne vois pas trop où est le problème là.. Mon while est sencé traiter le fichier ligne par ligne jusqu'à la fin du fichier..
Voici ma fonction :
(Elle est dans une classe de gestion de fichiers.
$this->filePointer est le pointer sur le fichier ouvert.
$this->fileCurseur est le curseur interne dans le fichier.
$this->fileName est l'adresse et le nom du fichier, ici "essai.txt".
Le fichier est préalablement ouvert en mode r+. (Je viens de penser : peut-être que le fichier doit être fermé pour qu'on puisse utiliser chmod ?)
Code :
- function pregReplaceFile($modele,$remplacant)
- {
- // précondition : fichier ouvert.
- fseek($this->filePointer,0); // On remet le curseur en début de fichier.
- $old = umask(0000);
- chmod($this->fileName,0666);
- umask($old);
- $this->fileCurseur = @ftell($this->filePointer); // Ca vaut 0, mais dans le doute, je le recalcule.
- while($source = @fgets($this->filePointer)) // On parcourt le fichier ligne par ligne (parce visiblement,
- //on ne peut pas avoir tout le fichier dans une chaine ?)
- {
- echo "<br>source : ".$source;
- if($resultat=preg_replace($modele,$remplacant,$source))
- {
- // Si on trouve le modèle, on remplace.
- fseek($this->filePointer,$this->fileCurseur);
- fputs($this->filePointer,$resultat);
- echo "<br>Resultat : ".$resultat;
- }
- $this->fileCurseur = ftell($this->filePointer);
- $source=""; // inutile.
- }
- echo "<br>FIN";
- chmod($this->fileName,0644);
- }
|
Voici le contenu de mon fichier de test "essai.txt" :
Code :
- Je m'appelle : [NOM] !!
- Bonjour [NOM]...
|
Et l'appel à la fonction pregRepaceFile :
Code :
- $essai = new files("essai.txt" );
- $essai->openFile("r+" );
- $essai->pregReplaceFile("`\[NOM\]`","Triphon Tournessol" );
|
Cela affiche :
Code :
- Warning: chmod(): Operation not permitted in /home/www/..../tools/files.class.php on line 61
- source : Je m'appelle : [NOM] !!
- Resultat : Je m'appelle : Triphon Tournessol !!
- source : ...
- Resultat : ...
- FIN
- Warning: chmod(): Operation not permitted in /home/www/..../tools/files.class.php on line 77
|
et le fichier essai.txt contient :
Je m'appelle : Triphon Tournessol !!
... |
Voila, donc est-ce que vous pourriez me donner quelques conseils ? En créeant une fonction qui efface d'abord la chaine recherchée dans le fichier, j'ai peur de m'enfoncer dans quelque chose de trop lourd. Je veux un programme léger, et peut-être que sans le savoir, je m'enmerde pour rien, et qu'une fonction de type preg_replace existe déjà pour les fichiers.. Mais je ne la connais pas... Merci pour votre aide !
EDIT : Sinon, est-ce que ça ne serait pas plus simple de récupérer tout le fichier sous forme d'un tableau des lignes du fichier, de concatener chaque ligne du tableau, de faire un ereg_replace sur cette grosse chaine, et de remplacer le contenu du fichier texte par la chaine qu'on vient de fabriquer ? J'ai peur que ce soit lourd. Mon but est vraiment de faire la fonction la plus simple et la plus légère possible. Je ne sais pas si 1 preg_replace sur chaque ligne d'un fichier de 1000 lignes (ça fait 1000 appels à preg_replace) est plus long que 1 preg_replace sur une grosse chaine qui représente un fichier de 1000 lignes...
Message édité par Docteur_Cube le 27-06-2006 à 14:17:00