Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2006, 00h10   #1
Membre émérite
 
Inscription : septembre 2002
Messages : 1 635
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : septembre 2002
Messages : 1 635
Points : 998
Points : 998
Par défaut doublons avec les expressions régulières

Bonjour à tous,

Voici le contenu du fichier analysé :
Code :
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 :
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 :
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
Mister Nono est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 00h36   #2
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 09h06   #3
Membre éprouvé
 
Homme
Inscription : mai 2006
Messages : 694
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : mai 2006
Messages : 694
Points : 417
Points : 417
Essaie cette modif pour voir

Code :
$result = eregi("^\"(.*)\"$", $ligne, $regs);
webrider
__________________
Pensez au tag
webrider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 09h13   #4
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 10h23   #5
Membre émérite
 
Inscription : septembre 2002
Messages : 1 635
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : septembre 2002
Messages : 1 635
Points : 998
Points : 998
Voici la réponse que j'ai trouvé :

Code :
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
Mister Nono est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 10h39   #6
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Citation:
Envoyé par Mister Nono
Voici la réponse que j'ai trouvé :

Code :
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 :
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
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 11h30   #7
Membre émérite
 
Inscription : septembre 2002
Messages : 1 635
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : septembre 2002
Messages : 1 635
Points : 998
Points : 998
Merci FCYPBA,
__________________
La connaissance ne sert que si elle est partagée.
http://ms2i.net
Mister Nono est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 11h57   #8
Membre émérite
 
Inscription : septembre 2002
Messages : 1 635
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : septembre 2002
Messages : 1 635
Points : 998
Points : 998
Comme indiquer par FCYPBA, je remplace :

Code :
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 :
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 :
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
Mister Nono est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 12h14   #9
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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 :
1
2
 
preg_match_all("/http(.*).jpg/", $page, $regs);
Pierre
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h22.


 
 
 
 
Partenaires

Hébergement Web