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 :

preg_match_all n'accumule pas le tableau


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut preg_match_all n'accumule pas le tableau
    Bonjour à tous,

    Les données ne semble pas s'ajouter dans le tableau $matches ligne 71.

    La ligne 58 a été ajoutée pour le test.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <?php 
    /*
    PHP5
    if you create an improved version 
    http://www.jeanpierredaviau.com/feedback.htm
    php -check-f imggex.php snow.html
    */
     
    class imggex{
     
    private $fichier; 
    private $title;
     
    	function __construct($argv){
    			$argc = count($argv);
    			if ($argc < 2 || in_array($argv[1], array("help", "help", "h", "?", "aide", "au secours"))) {
    			PRINT <<<END
    			C\'est une ligne de commande à 2 arguments.
    
    			Utilisation :
    			>php -check-f imggex.php Fichier titre
    
    			arguments:
    					 Fichier à être formaté comme suit:
    							  Texte		1  Texte
    							  Texte		2  Texte
    		  
    		  Avec les options help, help, h, ?, aide, et au secours, vous obtiendrez cette aide.
    END;
    		}
     
     
     
    	$this->fichier = $argv[1]; 
    	$this->title = $argv[2];
    	}
     
    function main(){
    //Chaîne seulement
    $rechercher  = '#[^/]+[A-Za-z0-9._-]+\.[a-z\"]{3}#i';
    $matches = array();
     
    			// open file for reading
    			if(!($myFile = fopen($this->fichier, "r")))
    			{
    				print("Error:");
    				print("$this->fichier est impossible à lire\n");
    				exit;
    			}
     
    			while(!feof($myFile))
    			{
    			//read a line from the file
    			$ligne = fgets($myFile, 255);
     
    			preg_match($rechercher, $ligne, $matches);
    			//Ici les lignes s'imprime.
    			print_r($matches);
    			}
     
    			//close the file
    			fclose($myFile);
     
    			foreach($matches as $key=>$value){
    			echo  $value . ". \n";
    				foreach($value as $key=>$value2)
    				echo  $value2 . ". \n";
    			}
    		//Ici les lignes ne s'imprime pas.
    		echo "--------------------\n";
    		print_r($matches);
    	}
     
    }
     
    $N = new imggex($argv);
    $N->main();
     ?>
    Merci de votre attention.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Soigne tes explications, tu ne décrit pas ce que ton programme doit faire.

  3. #3
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par gomodo Voir le message
    Soigne tes explications, tu ne décrit pas ce que ton programme doit faire.
    Il doit lister le nom de tous les fichiers images se trouvant dans une page html.
    J'ai modifié cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $rechercher  =  '#[^/]+[A-Za-z0-9._-]+\.[abfgijmnpstvxz]{3,4}#i';
    Je pourrais dans l'extrait qui suit utiliser array_push($montableau, $matches[0]); mais je me demande pour quoi preg_match ne peut pas faire le même travail.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		while(!feof($myFile))
    			{
    			//read a line from the file
    			$ligne = fgets($myFile, 255);
     
    			preg_match($rechercher, $ligne, $matches);
     
     
                                          //Ici les lignes s'imprime.
    			print_r($matches);
    			}
    JPD

  4. #4
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Oui mais ton code ne fait pas la différence entre un nom de fichier dans une balise img et un nom de fichier qui traine dans du texte libre.
    1. il faut que tu trouve une expression rationnelle qui extrait l'intérieur d'une balise img
    2. tu extrait "chemin_a_extraire" qui se trouve ici : src="chemin_a_extraire"
    3. Ensuite tu extrait l'image .. si il y en a une !! (*)


    (*) il existe des images qui ont ce format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src='/photo/generateur_dynamique.php?code=0442b8542c56' />
    Si l'on souhaite avoir du code robuste, c'est un cas qu'il faut gérer..

    Quand cela marche.. tu peux penser t'occuper d'inclure ce traitement dans une recherche ligne par ligne dans un fichier.

    Pour ce pencher maintenant sur ton code de recherche ligne par ligne, tu as deux problèmes :
    1. Tu utilise preg_match sur la ligne.. je ne vois pas pourquoi on trouverais pas plus d'une image par ligne -> utilise preg_match_all
    2. A chaque ligne ton matches efface le précédent.. donc si la dernière ligne ton preg_match ne trouve rien, bin.. tu n'as rien du tout.


    Voila un début de code qui va dans le bon sens :
    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
    <?php 
    if(!($myFile = fopen(realpath(dirname(__FILE__).'\coucou.txt'), "r")))
    {
    	print("Error:");
    	print("fichier est impossible à lire\n");
    	exit;
    }
     
     
    $trouve_sur_toute_les_lignes= array();
    $trouve_sur_une_ligne = array();
     
    while(!feof($myFile))
    {
    $ligne = fgets($myFile, 4096);
    preg_match_all ("#<img(.*?)>#s",$ligne,$trouve_sur_une_ligne);
    array_push ($trouve_sur_toute_les_lignes,$trouve_sur_une_ligne);
    }
    fclose($myFile);
     
    echo var_export($trouve_sur_toute_les_lignes,true); 
     ?>

  5. #5
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut lister images d'un fichier html
    Bonjour à tous,

    J'ai un regex qui me donne comme résultat ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'traced2.jpg
    final.thu.zip
    ditpaths.gif
    tra.vers.gif
    traced1.jpeg
    à partir de cet exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <p><img src="images/tra.vers.gif" width="500" height="188" alt="-" /></p>
    <p><img src="images/traced1.jpeg" width="500" height="188" alt="-" /></p>
    <p><img src='traced2.jpg' width="341" height="299" alt="-" /></p>
    <p><img src=ditpaths.gif width="379" height="268" alt="-" /></p>
    <a href="final.thu.zip target="_blank">full resolution on black background</a>
    <img src='/photo/generateur_dynamique.php?code=0442b8542c56' />
    Traiter avec ce regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $matches = array();
    $rechercher = ([^/|\"|=|'])[A-Za-z0-9._-]+\.([gif]|[svg]|[png]|[jpg]|[jpeg]){3,4}#im
     
    preg_match_all($rechercher, $ligne, $matches);
    Je voudrais obtenir cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tra.vers.gif
    traced1.jpeg
    traced2.jpg
    ditpaths.gif
    final.thu.zip
    generateur_dynamique.php?code=0442b8542c56
    Merci de votre attention,

    HJPD

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    En faisant simple (ça s'optimise surement):

    <?php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $str = <<< END
    <p><img src="images/tra.vers.gif" width="500" height="188" alt="-" /></p>
    <p><img src="images/traced1.jpeg" width="500" height="188" alt="-" /></p>
    <p><img src='traced2.jpg" width="341" height="299" alt="-" /></p>
    <p><img src=ditpaths.gif width="379" height="268" alt="-" /></p>
    <a href="final.thu.zip target="_blank">full resolution on black background</a>
    <img src='/photo/generateur_dynamique.php?code=0442b8542c56' />
    END;
     
    $reg = '#src=["\'].*?([^/]*?)["\']#i';
     
    preg_match_all($reg, $str, $m);
     
    print_r($m);

  7. #7
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    C'est frot mais il manque: final.thu.zip du href= .
    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
     
    Array
    (
        [0] => Array
            (
                [0] => src="images/tra.vers.gif"
                [1] => src="images/traced1.jpeg"
                [2] => src='traced2.jpg"
                [3] => src='/photo/generateur_dynamique.php?code=0442b8542c56'
            )
     
        [1] => Array
            (
                [0] => tra.vers.gif
                [1] => traced1.jpeg
                [2] => traced2.jpg
                [3] => generateur_dynamique.php?code=0442b8542c56
            )
     
    )
    Pourrais-tu me traduire en mots l'expression:*? ?

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    le motif .*? est une sélection "ungreedy", c'est à dire qui en prends le moins possible.

    J'ai adapté, j'avais pas vu le href :

    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
    <?php
    $str = <<< END
    <p><img src="images/tra.vers.gif" width="500" height="188" alt="-" /></p>
    <p><img src="images/traced1.jpeg" width="500" height="188" alt="-" /></p>
    <p><img src='traced2.jpg" width="341" height="299" alt="-" /></p>
    <p><img src=ditpaths.gif width="379" height="268" alt="-" /></p>
    <a href="final.thu.zip target="_blank">full resolution on black background</a>
    <img src='/photo/generateur_dynamique.php?code=0442b8542c56' />
    END;
    
    $reg = '# (?: src|href ) = ["\'\s]? [^"\'\s]*? ([^/\s]*?) ["\'\s]? (?:\s|/>) #ix';
     
    preg_match_all($reg, $str, $m);
     
    print_r($m[1]);

  9. #9
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    $reg = '# (?: src|href ) = ["\'\s]? [^"\'\s]*? ([^/\s]*?) ["\'\s]? (?:\s|/>) #ix';
    ... ouais ...

    x permet de placer des espaces dans l'expression?
    (?: étend le sens de : vers src|href ?
    ["\'\s]? et cici ? est non greedy?

Discussions similaires

  1. [2.3.2] ne pas afficher tableau si vide
    Par thebest31 dans le forum BIRT
    Réponses: 2
    Dernier message: 27/05/2009, 14h53
  2. Etats Rapides ne remplit pas le tableau
    Par sieste68 dans le forum 4D
    Réponses: 5
    Dernier message: 24/01/2009, 18h45
  3. Zend_BD->query() ne retourne pas un tableau d'objets
    Par Jokaritaff dans le forum Zend_Db
    Réponses: 6
    Dernier message: 04/06/2008, 12h14
  4. Firefox et ie n'affiche pas mon tableau de la même manière.
    Par poly128 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/10/2007, 15h27
  5. [HTML] boucle sur une variable et non pas un tableau
    Par delma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/11/2006, 15h03

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