IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Lire un fichier, rechercher toutes les chaines de carac.


Sujet :

Langage PHP

  1. #21
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    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.

    Est-ce que cette approche pourrait correspondre à tes besoins ?

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    c'est EXACTEMENT ça que je veux faire !!!
    très bonne analyse de la chose j'avoue !
    maintenant pour faire tout ça ! lol c pas du gateau pour moi
    c rapide pour quelqu'un qui a de la bouteille ? je voudrais pas vous faire perdre votre temps ...

  3. #23
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Essaie déjà ce bout de code là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?
    	define('RANGE', 20);					// nombre de caractères a prendre avant et après le mot
    	define('EXTENSIONS', 'php,html');		// extensions des fichiers à traiter séparées par des virgules
     
    	function scanDir($dirname, $extensions, $recurse) {
    		$files = array();
    		if(file_exists($dirname)) {
    			$dir = dir($dirname);    
    			while (false !== $entry = $dir->read()) {        
    				if($entry == '.' || $entry == '..') continue;
    				if($recurse && is_dir($dirname.'/'.$entry)) 
    				$files = array_merge($files, scanDir($dirname.'/'.$entry, $extensions, true));
    				$pi = pathinfo($entry);
    				if(in_array(strtolower($pi['extension']), $extensions)) {
    					$files[] = $dirname.'/'.$entry;
    				}
    			}
    			$dir->close();    
    		}
    		return $files;
    	}
     
    	function scanFile($file, $word) {
    		$code = file_get_contents($file);
    		$last = 0;
    		$items = array();
    		$n = 0;
    		while( ($pos=strpos($code, $word, $last)) !== false) {
    			$bi = max(0, $pos-RANGE);
    			$before = substr($code, $bi, $pos-$bi);
    			$astart = $pos+strlen($word);
    			$aend = min(strlen($code), $astart+RANGE);
    			$after = substr($code, $astart, $aend-$astart); 
    			$link = "<a href='suppr.php?file=$file&n=$n'>".htmlentities($word)."</a>";
    			$items[] = htmlentities($before).$link.htmlentities($after);
    			$last = $astart;
    			$n++;
    		}
    		return $items;
    	}
     
    	$word = "<link";	// mot à rechercher
    	$root = '/dossier/sousdossier'; // dossier racine de départ (sans / à la fin)
     
    	$files = scanDir($root, explode(',', EXTENSIONS), true);
    	foreach($files as $file) {
    		$items = scanFile($file, $word);
    		if($items) {
    			echo "<h2>".htmlentities($file)."</h2>";
    			foreach($items as $item) {
    				echo "<p>".$item."</p>";
    			}
    		}
    	}
    ?>

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    je ne cache pas que je galère pas mal à comprendre la plupart des fonctions utilisées...
    j'essaye de modifier le code pour l'utiliser mais je misère je reste bloqué sur une fatal error: Cannot redeclare scandir()

  5. #25
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Tu arrives à le faire fonctionner chez toi (sans le modifier) ?

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    j'ai rempli des fichiers avec du texte, des mots au hasard, des urls, des balises pour simuler ce que je scannerai plus tard.

    et en résultat j'ai :

    C:/wamp/www/script_replace3/index.php
    } $word = "jos"; // mot à recher

    C:/wamp/www/script_replace3/test.php
    dy></body> <body> josé http://www.php.ne

    C:/wamp/www/script_replace3/test2.php
    dy></body> <body> josé joséé http://www

    ody> <body> josé joséé http://www.php.n

    donc là le mot que j'ai cherché est : josé. et il est bien lienté ça va.
    ... lol

    je commente ce que je fais en live, désolé si ça prend bcp de posts...

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    bon j'ai analysé le code plus en détails en fait c tro bien j'comprend pas trop mal. il reste a faire le fichier suppr pour supprimer l'occurence, je pense que je vais avoir du mal, mais je vais essayer !

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    bon ça a l'air d'aller
    il me faudrait juste pouvoir scanner un fichier et modifier la chaine en fonction de son numéro d'occurence.
    j'ai ça dans le fichier suppr pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    <?php
    $file= $_GET['file'];
    $n= $_GET['n'];
    $remplace= $_GET['rep'];
    $word= $_GET['mot'];
     
    echo 'Le fichier est : <b>'.$file.'</b> <br><br>Le numéro de l\'occurence est : <b>'.$n.'</b> 
    <br><br>Le mot de remplacement : <b>'.$remplace.'</b>';
     
     
    $old_content = file_get_contents($file);
    $new_content = [b]str_replace($word, $remplace, $old_content); [/b]
     
    if(strcmp($old_content, $new_content)) //si le fichier texte a changé
    							{
                                    if(false !== ($fp = fopen($file, 'w'))) {
                                        fwrite($fp, $new_content);
                                        fclose($fp);
                                    }
                                    echo '<li>' . $file . '</li>';
    							}
    ?>
    si le $word recherché est "motrecherché", et qu'il apparait plusieurs fois dans le fichier, mais qu'on veut modifier que la 2ème occurence : $n == 2

    .... comment faire !?!??
    j'ai mis en gras la fonction qui fait le remplacement. je voudrai qu'elle ne remplace pas la première occurence mais que la deuxième par exemple !
    ... !!

    ps : j'ai changé dans la fonction scanFile :
    $link = "<a href='suppr.php?file=$file&n=$n&rep=$remplace&mot=$word'>".htmlentities($word)."</a>";

  9. #29
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Voici la fonction de remplacement qu'il te faut, j'ai fait qq tests
    ça a l'air de jouer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?
     
    	function str_replace_n($search, $replace, $subject, $n) {
    		$last = 0;
    		$i = 0;
    		while( ($pos=strpos($subject, $search, $last)) !== false) {
    			if($i==$n) {
    				$pos2 = $pos+strlen($search);
    				$before = substr($subject, 0, $pos);
    				$after = substr($subject, $pos2, strlen($subject)-$pos2); 
    				return $before.$replace.$after;
    			}
    			$last = $pos+1;
    			$i++;
    		}
    		return $subject;
    	} 
     
    	echo str_replace_n("def", "xxx", "abc def ghi", 0)."<br>";
    	echo str_replace_n("def", "xxx", "abc def ghi", 1)."<br>";
    	echo str_replace_n("abc", "xxx", "abc def ghi", 0)."<br>";
    	echo str_replace_n("abc", "xxx", "abc def ghi", 1)."<br>";
    	echo str_replace_n("ghi", "xxx", "abc def ghi", 0)."<br>";
    	echo str_replace_n("ghi", "xxx", "abc def ghi", 1)."<br>";
     
    	echo str_replace_n("a", "*", "abc aabc aaabc", 0)."<br>";
    	echo str_replace_n("a", "*", "abc aabc aaabc", 1)."<br>";
    	echo str_replace_n("a", "*", "abc aabc aaabc", 2)."<br>";
    	echo str_replace_n("a", "*", "abc aabc aaabc", 3)."<br>";
    	echo str_replace_n("a", "*", "abc aabc aaabc", 4)."<br>";
     
    	echo str_replace_n("abc", "*", "abc aabc aaabc", 0)."<br>";
    	echo str_replace_n("abc", "*", "abc aabc aaabc", 1)."<br>";
    	echo str_replace_n("abc", "*", "abc aabc aaabc", 2)."<br>";
    	echo str_replace_n("abc", "*", "abc aabc aaabc", 3)."<br>";
    	echo str_replace_n("abc", "*", "abc aabc aaabc", 4)."<br>";
     
    ?>

  10. #30
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Attention ! j'ai numéroté les occurences en commençant à 0.
    C'est à dire, que la première occurence c'est 0, la deuxième 1, etc.

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    nikel ! ça marche bien
    tu es mon sauveur !!!
    si j'ai d'autres problèmes je reviens ici si j'arrive pas a résoudre le truc, il m'a l'air super bien fréquenté ce forum !!! 8)
    merci encore !

  12. #32
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    2 rien

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/05/2012, 14h27
  2. Lire un fichier texte toutes les 3 secondes
    Par sam14 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 28/03/2012, 16h36
  3. Réponses: 5
    Dernier message: 21/02/2007, 16h12
  4. Réponses: 4
    Dernier message: 25/07/2006, 11h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo