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 :

Regexp pour exclusion de répertoire dans Phar


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Par défaut Regexp pour exclusion de répertoire dans Phar
    Bonjour,

    Je souhaite créer un système automatisé d'archivage de dossiers en utilisant la classe Phar de Php 5.3.

    D'après la documentation, je peux ajouter un dossier et faire une exclusion avec une Regexp.
    array Phar::buildFromDirectory ( string $base_dir [, string $regex ] )

    J'ai donc l'arborescence suivante:
    /repertoire1
    /repertoire1/fichier1
    /repertoire1/fichier2
    /repertoire1/...

    /repertoire2
    /repertoire2/fichier1
    /repertoire2/...

    /tmp
    ...
    /cache
    ...

    Et j'aimerais EXCLURE les dossiers tmp et cache.

    Je sais faire l'expression qui ne sélectionnera QUE ces deux dossiers
    ^\/cache(.*)|^\/tmp(.*)
    , mais pas les exclure!

    Quelle Regexp utiliser pour exclure ces deux dossiers?

    Merci de votre aide!

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu vas devoir passer par buildFromIterator, coupler à RecursiveDirectoryIterator + RegexIterator

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Par défaut
    Merci pour le renseignement, mais je bloque encore...

    Voici ce que je fais pour afficher la liste des dossiers et fichiers que j'insérerai dans l'archive:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $iter = new RecursiveIteratorIterator(
    		new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::KEY_AS_FILENAME)
    		    , RecursiveIteratorIterator::SELF_FIRST);
     
    $f = new RegexIterator($iter,'/^(.*)/');
     
        foreach ($f as $value) 
    	echo $value->key().' - '.$value->getFilename().'<br />';
    Et peu importe la regex que j'utilise, je n'ai rien qui s'affiche. En bref je ne sais pas comment utiliser RegexIterator sur un autre Iterator.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Par défaut
    Bon en fait, je me demande si je suis même sur la bonne voie étant donné que je veux EXCLURE certains dossiers au moyen de ma Regex.

    Or, RegexIterator ne permet dans ses constantes que de soit sélectionner la PREMIÈRE, soit TOUTES les occurrences.

    Je veux un DirectoryRecursiveIterator et ensuite un test basique
    if (strpos($entry,'/tmp') || (strpos($entry,'/cache')
    qui EXCLUT les deux dossiers.

    Est il possible de faire une négation d'un RegexIterator?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu peux créer ton propre filtre avec FilterIterator

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Par défaut
    Ok merci en effet comme ça ça peut fonctionner.

    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
    class ExcludeFolderFilter extends FilterIterator{
    	private $userFilter;
     
    	public function __construct(Iterator $iterator , $filter ){
    	    parent::__construct($iterator);
    	    $this->userFilter = $filter;
    	}
     
    	public function accept(){
    	    $folder = $this->getInnerIterator()->current();
     
    	    // Création de la REGEX à partir du tableau d'exclusion des dossiers
    	    $regex_text = str_replace('/', '\/', implode('|',$this->userFilter));
    	    $regex_text = str_replace('.', '\.', $regex_text);
     
    	    //echo "<br/>REGEXP :" . $regex_text . "<br/>";
     
    	    $regex = '/^(?:' . $regex_text . ')(.*)$/';
    	    if (preg_match($regex, $folder->getPath())){		
    		return false;
    	    }else{
    		return true;
    	    }
    	}
        }
     
    $iter = new RecursiveIteratorIterator(
    		new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::KEY_AS_FILENAME)
    		    , RecursiveIteratorIterator::SELF_FIRST);
     
        $iterator = new ExcludeFolderFilter($iter, $exclusion_array);
     
    $phar->buildFromIterator($iterator, $root);
    Cependant j'ai à présent un souci qui ne concerne plus l'itération, mais le comportement de Phar.

    En fait, dans mes fichiers il y en a qui ont des caractères "invalides" selon Phar. Sauf que moi je veux quand même conserver ces caractères!

    Que dois je faire pour que ce fichier soit tout de même ajouté à l'archive?
    Evidemment, je veux conserver le nom du fichier intact...

    Est ce dans le FilterIterator que je peux modifier son "étiquette" dans l'itération?

    Faut il que je crée un nouveau sujet pour cette question?

    Merci

Discussions similaires

  1. Commande pour changer de répertoire dans un explorateur déjà ouvert
    Par ApolloXIII dans le forum Général Python
    Réponses: 3
    Dernier message: 25/04/2013, 11h10
  2. exclusion de répertoire dans arborescence
    Par Invité(e) dans le forum Général Python
    Réponses: 3
    Dernier message: 14/08/2009, 08h01
  3. Réponses: 9
    Dernier message: 20/02/2009, 17h51
  4. Réponses: 6
    Dernier message: 21/02/2008, 19h35
  5. Réponses: 3
    Dernier message: 30/10/2007, 12h56

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