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 :

doublons avec les expressions régulières


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 244
    Par défaut doublons avec les expressions régulières
    Bonjour à tous,

    Voici le contenu du fichier analysé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <img  src="http://medias.immovision.com/photos/p0/12012/2925a01.jpg" >
     <img  src="http://medias.immovision.com/photos/p0/12012/2925a02.jpg">
     <img  src="http://medias.immovision.com/photos/p0/12012/2925a03.jpg">
     <img  src="http://medias.immovision.com/photos/p0/12012/2925a04.jpg">
    Voici le code PHP qui extrait le path des images du fichier ci-dessus :
    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
     
    $url = "http://www.mon-site.fr/le-fichier-analyse.html";
     
    $fp = fopen($url,"r");
     
    if($fp)
    {
       	echo "PHOTO => <br /><br />";
     
       	while (!feof($fp))
       	{
        	$ligne = fgets($fp, 8192);
     
      		$result = eregi("\"(.*)\"", $ligne, $regs);
     
      		echo $regs[1] . "<br />";
     
       	}
     
    }
    else
    {
    	echo "Impossible d'ouvrir la page $url";
    }
     
    fclose($fp);
    Et voici le résultat affiché après exécution du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PHOTO =>
     
    http://medias.immovision.com/photos/p0/12012/2925a01.jpg
    http://medias.immovision.com/photos/p0/12012/2925a02.jpg
    http://medias.immovision.com/photos/p0/12012/2925a03.jpg
    http://medias.immovision.com/photos/p0/12012/2925a04.jpg
    http://medias.immovision.com/photos/p0/12012/2925a04.jpg
    http://medias.immovision.com/photos/p0/12012/2925a04.jpg
    Il est trouvé 3 fois le path de l'image 2925a04.jpg (parfois le path n'est mentionné que 2 fois), alors qu'il devrait être trouvé 1 seule fois.

    Pourquoi cela ?

    Merci.

  2. #2
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Je ne saurais te dire pourquoi tu recupère plusieurs fois la même image.

    Mais tout d'abord, lors de la recup de la liste des images, es-tu sur que tout sera correctement placé. Avec mon aspirateur, j'avais été confronté à un problème car je pouvais avoir des données réparties sur plusieurs retours de fgets ( il n'y avait pas forcément un retour chariot ).
    Pour remedier au problème, dorénavant, je stocke tout dans un buffer .

    Et c'est là que les expressions perl rentre en jeu et notamment la fonction preg_match_all qui comme son nom l'indique match( et recup ) toutes les occurences du masque et c'est vachement utile pour les aspirateur

    L'autre avantage, c'est que les expressions perl sont plus rapide. Pour les infos sur les masques, je te renvoie vers la FAQ de developpez F.A.Q

    A ta disposition,

    Pierre

  3. #3
    Invité
    Invité(e)
    Par défaut
    Essaie cette modif pour voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = eregi("^\"(.*)\"$", $ligne, $regs);
    webrider

  4. #4
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Cette modif ne fonctionnera pas car tu as ajouté des modificatuers pour indiquer le début et la fin d'une ligne. Ce n'est pas ce qu'il veut faire. Il veut récuperer ce contient l'attribut src de img.

    Il faudrait plutôt qu'il augmente son masque de façon à être plus précis en la modifiant comme ceci, par exemple

  5. #5
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 244
    Par défaut
    Voici la réponse que j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    il faut mettre $regs = null; avant de quitter la boucle while()
    Merci à tous.

  6. #6
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Citation Envoyé par Mister Nono
    Voici la réponse que j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    il faut mettre $regs = null; avant de quitter la boucle while()
    Merci à tous.
    Ah je sais pourquoi.

    Tu ne testait pas la valeur de retour de l'expression régulière. Donc, meme si celle-ci ne trouvait rien, tu affichais le contenu de regs ( qui avait encore les anciennes valeurs trouvées.)

    Plus propre que $regs = null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (!feof($fp))
       	{
        	$ligne = fgets($fp, 8192);
     
      		$result = eregi("\"(.*)\"", $ligne, $regs);
      		if ($result === TRUE )	echo $regs[1] . "<br />";
     
       	}
    Sinon, penches toi du coté de preg_match_all() et de preg en général, ton serveur me remerciera.

    Bonne continuation dans ton projet
    pierre

Discussions similaires

  1. [RegEx] Correction avec les expressions régulières
    Par bagu dans le forum Langage
    Réponses: 2
    Dernier message: 16/11/2007, 13h25
  2. [C#] problème avec les expressions régulières
    Par luimême dans le forum C#
    Réponses: 1
    Dernier message: 13/06/2007, 15h44
  3. [C#]Probleme avec les Expressions régulières
    Par akram46 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 07/10/2006, 13h08
  4. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  5. Problème avec les expressions régulières
    Par Premium dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/06/2006, 16h41

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