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

Eléphanteau du PHP | 14 Messages

12 juil. 2008, 09:35

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2008, 12:23

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 ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 14 Messages

13 juil. 2008, 10:53

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

Mammouth du PHP | 959 Messages

13 juil. 2008, 14:50

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 ?

Eléphanteau du PHP | 14 Messages

13 juil. 2008, 16:36

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 ?

Mammouth du PHP | 959 Messages

13 juil. 2008, 16:43

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 ;)

Eléphanteau du PHP | 14 Messages

13 juil. 2008, 16:56

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:
Modifié en dernier par PoteVince le 13 juil. 2008, 16:59, modifié 1 fois.

Mammouth du PHP | 959 Messages

13 juil. 2008, 16:59

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 ;)

Eléphanteau du PHP | 14 Messages

13 juil. 2008, 17:02

Merci pour tout en tout cas :D

Mammouth du PHP | 959 Messages

13 juil. 2008, 17:26

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

Eléphanteau du PHP | 14 Messages

14 juil. 2008, 09:24

Merci beaucoup cela fonctionne très bien ;)