Page 1 sur 1

Remplacement d'un mot ou d'une chaine dans fichier déjà créé

Posté : 12 juil. 2008, 09:35
par PoteVince
Bonjour,
Je souhaitais remplacer un mot ou une chaine dans fichier txt déjà créé.
J'ai essayé avec str_replace, preg_replace,... mais sans succès. Cela ne donne pas de message d'erreur.
$fp = fopen ("exemple2.txt", "a+");    
$recapitulatif3 = fgets ($fp, 11); 
$recapitulatif2 = str_replace("motatrouver", "devrait se remplacer par bla bla", $recapitulatif3);
fseek ($fp, 0);   
fputs ($fp, $recapitulatif2);
fclose ($fp);  
Merci
J'en profite pour une question liée : est-il possible de supprimer toute la ligne contenant ce mot même si les valeurs autour de ce mot ne sont pas toujours les mêmes ?
Merci

Posté : 12 juil. 2008, 12:23
par Ryle
Quand tu ouvres un fichier en mode a+, le pointeur de fichier se retrouve à la fin de manière à pouvoir écrire à la suite... je pense que du coup le fgets ne te retourne rien...

Ne serait-il pas plus simple pour toi de lire le fichier avec file() puis de parcourir le tableau contenant chaque ligne en modifiant ou supprimant celles qui contiennent la chaine cherchée et en écrasant ensuite le contenu du fichier ? :)

Posté : 13 juil. 2008, 10:53
par PoteVince
J'ai essayé en mode r+ mais cela ne change que le premier trouvé.

J'ai donc opté pour le file() mais cela ne me donne rien (hormis l'affichage du tableau).
Les éléments ne sont pas modifiés.
$lines = file('exemple2.txt');
foreach ($lines as $line_num => $line) {
        $recapitulatif2 = str_replace("mot a trouver", "devrait se remplacer par bla bla", $line);
        echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
	}
A quoi est-ce dû ?
Merci

Posté : 13 juil. 2008, 14:50
par chrislabricole
Normal, tu mets le résultat du remplacement dans la variable $recapitulatif2 et tu affiches $line donc ça modifie dans la variable, mais tu ne l'affiche pas, donc, tu as 2 solutions :
$lines = file('exemple2.txt');
foreach ($lines as $line_num => $line) {
        $recapitulatif2 = str_replace("mot a trouver", "devrait se remplacer par bla bla", $line);
        echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($recapitulatif2) . "<br />\n";
    }
OU
$lines = file('exemple2.txt');
foreach ($lines as $line_num => $line) {
        $line = str_replace("mot a trouver", "devrait se remplacer par bla bla", $line);
        echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line. "<br />\n";
    }
(je te conseil celle-ci)

Après, tu veux réécrire le résultat dans le même fichier que tu as ouvert ou tu veux juste afficher ?

Posté : 13 juil. 2008, 16:36
par PoteVince
Normal, tu mets le résultat du remplacement dans la variable $recapitulatif2 et tu affiches $line
Arf oui le code d'affichage n'est même pas bon...
Après, tu veux réécrire le résultat dans le même fichier que tu as ouvert ou tu veux juste afficher ?

Oui je veux réécrire ce résultat dans le fichier mais le problème est que je ne sais pas écrire dans un fichier à partir du tableau.

Et comment pourrais-je supprimer toute une ligne lorsque je détecte un mot dans celle-ci ?

Posté : 13 juil. 2008, 16:43
par chrislabricole
Pour réécrire dedans, c'est assez simple, tu refais une FOR mais tu réécrit dans ton fichier, regarde ici (les exemples)

Pour supprimer la ligne à un mot trouvé, j'arriverai peut-être à faire une ligne blanche mais supprimer la ligne totalement euh... je ne vois pas trop comment faire :oops:

EDIT : regarde plutôt ici pour les exemples c'est mieux ;)

Posté : 13 juil. 2008, 16:56
par PoteVince
Pour réécrire dedans, c'est assez simple, tu refais une FOR mais tu réécrit dans ton fichier, regarde ici (les exemples)
C'est ce que j'ai fait mais depuis j'ai un soucis avec les caractères spéciaux (pour l'affichage).
$lines = file('exemple2.txt'); 
foreach ($lines as $line_num => $line) { // Affiche toutes les lignes du tableau comme code HTML, avec les numéros de ligne
        $line = str_replace("bla", "bla bla", $line); 
        echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line). "<br />\n"; 
    } 

$fp = fopen ("exemple2.txt", "r+");
foreach ($lines as $line_num => $line) {
        $line = str_replace("bla", "bla bla", $line); 
        echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line). "<br />\n"; 
		fputs ($fp, $line);
    }
//fseek ($fp, 0);  
fclose ($fp);
Pour supprimer la ligne à un mot trouvé, j'arriverai peut-être à faire une ligne blanche mais supprimer la ligne totalement euh... je ne vois pas trop comment faire
Je suis preneur pour la ligne vide déjà :wink:

Posté : 13 juil. 2008, 16:59
par chrislabricole
essaies de faire des tests avec ton htmlspecialchars et joues avec les fonctions utf8_encode() et utf8_decode() ;) je vais y réfléchir pour la ligne, comme ça, sa me permettra de m'améliorer aussi :D

je te tiens au courant ;)

Posté : 13 juil. 2008, 17:02
par PoteVince
Merci pour tout en tout cas :D

Posté : 13 juil. 2008, 17:26
par chrislabricole
Voilà, j'ai réussi à affiché "Ligne censuré." quand il trouve le mot dans la ligne
$fichier = 'exemple2.txt';
$lines = file($fichier); 
$fp = fopen ($fichier, "r+");
foreach ($lines as $line_num => $line) { // Affiche toutes les lignes du tableau comme code HTML, avec les numéros de ligne
        $line = str_replace("bla", "bla bla", $line);
		
		if(preg_match("/bla/i", $line)) {
			$line = "Ligne censur&eacute;.";
		}
		
        echo "Line #<b>{$line_num}</b> : " . utf8_decode(htmlspecialchars($line)). "<br />\n"; 
		fputs ($fp, $line);
}
	
fclose ($fp);
Pour la suppression totale de la ligne, je crois avoir une idée :)

Je test et je te dit ;)

EDIT : Voilà, j'ai réussi à ne pas faire afficher la ligne complête mais le prob, c'est que ça fais sauté le compteur (line #01, line #02 etc...). mais bon, je ne pense pas que dans ton site, dois afficher Line ... bref, voilà le code :
$fichier = 'exemple2.txt';
$lines = file($fichier); 
$fp = fopen ($fichier, "r+");
foreach ($lines as $line_num => $line) { // Affiche toutes les lignes du tableau comme code HTML, avec les numéros de ligne
        $line = str_replace("bla", "bla bla", $line);
		if(!preg_match("/bla/i", $line)) {
			fputs ($fp, $line);
			echo 'Line #<b>'.$line_num.'</b> : '. utf8_decode(htmlspecialchars($line)) .'<br />'."\n"; 
		}
}
	
fclose ($fp);
Voilà :P

Posté : 14 juil. 2008, 09:24
par PoteVince
Merci beaucoup cela fonctionne très bien ;)