Lire un fichier, rechercher/remplacer des chaines de carac.

Petit nouveau ! | 3 Messages

22 févr. 2006, 13:16

bonjour à tous
je ne suis pas très doué en php mais j'ai un problème sur un script !
j'ai un script qui permet de chercher une chaine de caractères dans un fichier
(on indique ds un formulaire un chemin d'accès, et les fichiers sont scanné à l'intérieur des dossiers et sous dossiers : ceci récursivement)
une fois la chaine trouvée, elle est remplacée par la chaine qu'a saisie l'utilisateur dans un formulaire.

je voudrai ne pas le remplacer automatiquement. mais créer un lien sur l'occurence, pour que l'utilisateur puisse la supprimer seulement en cliquant dessus. ce qui permet une sélection parmi toutes les occurence, pourne pas tout supprimer.

je peux vous copier mon code si quelqu'un a le courage dessayer de changer mon script pour arriver à faire ce que je veux...
j'ai parlé a quelqu'un qui m'a dit de suivre ces étapes :

Ok, donc le processus de scanning n'est pas long. Il est donc envisageable
de le refaire entre chaque remplacement, ce qui me parait une approche plus
simple, je m'explique:

1) on fait un fonction qui établi la liste des fichiers à traiter en parcourant
récursivement les dossiers et en testant les extensions valides. Cette
fonction retourne une liste de fichiers (liste de chemins complets). On
élémine ainsi le problème de la récursivité pour la suite, en travaillant avec
une liste de fichier.

2) on fait une fonction qui reçoit en parametre le nom d'un fichier.
Elle retourne une liste de bout de textes entourant une occurence
d'un mot cherché. Autour du mot elle crée un lien du genre:
<a href='suppr.php?path=/dossier/toto.php&num=12'>mot</a>
Ce qui voudrait dire, le 12ème mot du fichier toto.php

3) on crée une page formulaire qui demande le chemin du dossier racine,
le mot à rechercher et le mot à remplacer. cette page post sur la page
de l'étape 4) on peut sauver ces données dans la session

4) On appelle la fonction (1), celle-ci nous retourne la liste des fichiers à
traiter.
Pour chaque fichier:
- on affiche le nom du fichier <h1>nom du fichier</h1>
- on appelle la fonction (2), puis on affiche les morceaux de texte
Ceci va produire une page plus ou moins longue.

L'utilisateur clique sur un lien, on appelle la page suppr.php qui ouvre
le fichier indiqué, et effectue un remplacement du mot indiqué. puis
on redirige sur la page (4), ceci reprovoque le scan complet des dossiers
, ainsi on voit toujours la longue page, mais l'occurence du mot sur
lequel on a cliqué aurra disparu. A chaque clique de l'utilisateur,
la page diminue de hauteur.

voici mon code :

Code : Tout sélectionner

<html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <title>Formulaire de recherche</title> </head> <body bgcolor="#DDDDDD"> <table bgcolor="white" style="border-collapse:collapse;" width="375" align="center"> <tr> <td width="350" style="border-width:1; border-color:black; border-style:dashed;" height="179"> <br> <p align="center"><font face="Verdana"><span style="font-size:10pt;">&nbsp;<u>Formulaire de recherche :</u><br>&nbsp;</span></font></p> <form action="index.php" name="search" method="POST"> <table cellspacing="0" style="border-collapse:collapse;"> <tr> <td width="165" style="border-width:1; border-top-color:rgb(153,153,153); border-right-color:black; border-bottom-color:black; border-left-color:rgb(153,153,153); border-style:none;"> <p align="right"><font face="Verdana"><span style="font-size:8pt;">Chemin d'accès :</span></font></p> </td> <td width="165" style="border-width:1; border-top-color:rgb(153,153,153); border-right-color:rgb(153,153,153); border-bottom-color:black; border-left-color:black; border-style:none;"> <p><font face="Verdana"><span style="font-size:8pt;"><input type="text" name="path" value="C:/wamp/www/script_replace" size="35"></span></font></p> </td> </tr> <tr> <td width="165" style="border-width:1; border-top-color:black; border-right-color:black; border-bottom-color:black; border-left-color:rgb(153,153,153); border-style:none;"> <p align="right"><font face="Verdana"><span style="font-size:8pt;">Trouver :</span></font></p> </td> <td width="165" style="border-width:1; border-top-color:black; border-right-color:rgb(153,153,153); border-bottom-color:black; border-left-color:black; border-style:none;"> <p><font face="Verdana"><span style="font-size:8pt;"><input type="text" name="find" size="25"></span></font></p> </td> </tr> <tr> <td width="165" style="border-width:1; border-top-color:black; border-right-color:black; border-bottom-color:rgb(153,153,153); border-left-color:rgb(153,153,153); border-style:none;"> <p align="right"><font face="Verdana"><span style="font-size:8pt;">Remplacer :</span></font></p> </td> <td width="165" style="border-width:1; border-top-color:black; border-right-color:rgb(153,153,153); border-bottom-color:rgb(153,153,153); border-left-color:black; border-style:none;"> <p><font face="Verdana"><span style="font-size:8pt;"><input type="text" name="replace"></span></font></p> </td> </tr> </table> <p align="center">&nbsp;<a href="javascript:window.document.search.submit()">Envoyer</a> </p> </form> <?php if(isset($_POST['find']) & isset($_POST['replace'])) { if(!isset($_POST['find']) || (isset($_POST['find']) && $_POST['find']=="")) //si le champs de texte comprenant la chaine à rechercher n'est pas rempli faire : { echo'<script language="javascript">'; echo'alert("Chaîne à rechercher inconnue!");'; echo'javascript:history.back(1);'; echo'</script>'; } // Répertoire racine du scan (au format UNIX même sous Windows) $root_dir = $_POST['path']; // Extensions des fichiers concernés par le remplacement $ext = array('php', 'php3', 'inc'); // Chaine à chercher récupérée du formulaire $find = $_POST['find']; // Chaine à remplacer récupérée aussi du formulaire $replace = $_POST['replace']; ############################################################################################ //Fonction qui scanne un répertoire et ses sous-répertoires et modifie les fichiers concernés //si la chaîne est trouvée : function scan_dir($path, $find, $replace) { global $change, $ext; if(!$test=opendir($path)) // si le nouveau chemin d'accès saisi par l'utilisateur est mal spécifié : erreur { echo'<script language="javascript">'; echo'alert("Chemin d\'accès inconnu !");'; echo'javascript:history.back(1);'; echo'</script>'; } if(false !== $dp = opendir($path)) //retourne un pointeur sur un dossier pour être utilisé avec les fonctions closedir, readdir et rewinddir. { clearstatcache(); //Efface le cache de stat while($file = readdir($dp)) //retourne le nom du fichier suivant dans le dossier identifié par dir_handle { $f = $path . '/' . $file; //chemin d'accès + nom du fichier courant. if($file != '.' and $file != '..' and $f != $_SERVER['SCRIPT_FILENAME']) // SCRIPT_FILENAME : Le chemin absolu vers le fichier contenant le script en cours d'exécution { if(is_dir($f)) //Indique si le fichier $f est un dossier { scan_dir($f, $find, $replace); // rappel récursif si on a un nouveau dossier } else { $info_file = pathinfo($f); //retourne un tableau associatif, contenant les informations sur le chemin path . Les éléments suivants sont retournés : dirname , basename et extension foreach($ext as $extension) { if(isset($info_file['extension']) and 0 === strcmp($extension, $info_file['extension'])) //strcmp ret 0 si c'est égal { $old_content = file_get_contents($f); //Lit tout un fichier dans une chaîne $new_content = str_replace($find, $replace, $old_content); // Remplace toutes les occurrences dans une chaîne if(strcmp($old_content, $new_content)) //si le fichier texte a changé { $change = true; if(false !== ($fp = fopen($f, 'w'))) // remplacement des données avec le new_content. { fwrite($fp, $new_content); fclose($fp); } echo '<li>' . $f . '</li>'; } break; } } } } } closedir($dp); } return; } //Présentation des résultats echo '<br><br><p align="center"><font face="Verdana"><span style="font-size:10pt;"><u>Résultats du traitement : </u></span></p>'; echo "<span style=\"font-size:8pt;\">&nbsp Chaine recherchée : ".$_POST['find']."<br>"; echo "&nbsp Remplacer par : ".$_POST['replace']."<br><br>"; echo "<b>&nbsp Liste des fichiers modifiés : </b><br> </span></font>"; echo '<h5><ul>'; //On scan le répertoire et ses sous-répertoires $change = false; scan_dir($root_dir, $find, $replace); if(!$change) { echo '<li>Aucun fichier mis à jour !</li>'; } echo '</ul></h5>'; } ?> <p>&nbsp;</p></td></tr></table><p>&nbsp;</p> </body> </html>

merci beaucoup à celui ou celle qui arrivera à résoudre mon probleme ! parce que je comprend bien comment faire, mais en étant débutant je galèreeeeeeeeee vraiment à mettre tout en place depuis hier matin !