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

  1. #1
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 232
    Points : 1 897
    Points
    1 897
    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.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    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
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  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 éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    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
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  5. #5
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 232
    Points : 1 897
    Points
    1 897
    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.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    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
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  7. #7
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Merci FCYPBA,
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  8. #8
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Comme indiquer par FCYPBA, je remplace :

    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
     
     
    // NOTA : ce code fonctionne maintenant
     
    if($fp)
    {
       	// echo "PHOTO => <br /><br />";
     
       	while (!feof($fp))
       	{
       		$ligne = fgets($fp, 8192);
     
      		// $result = eregi("\"(.*)\"", $ligne, $regs);
      		$result = eregi("http(.*).jpg", $ligne, $regs);
     
      		if ($result > 0 )
      		{
      			echo $regs[0] . "<br />";
      		}		
       	} 	
    }
    par...

    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
     
    if($fp)
    {
       	$page = "";
     
       	while (!feof($fp))
       	{
       		$page .= fgets($fp, 8192);
     
       	}
     
      	preg_match_all("http(.*).jpg", $page, $regs);
     
      	// echo $regs[0];
      	print_r($regs);
     
    }
    et j'obtient pour la commande preg_match_all le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: Delimiter must not be alphanumeric or backslash in path_du_fichier-numero_de_ligne
    avec le tableau $regs vide.

    Pourtant l'expression régulière passée en paramètre n'a pas changé...

    Où est donc l'astuce pour que cela fonctionne ?

    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Les expressions régulières perl ne sont pas identiques aux autres. C'est pour cela que je t'ai donné le lien vers la FAQ

    En perl, il faut delimiter le masque avec un caractère spécial ( ce qui manque dans ton cas ). moi j'utilise '/'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all("/http(.*).jpg/", $page, $regs);
    Pierre
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

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