Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
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 23/07/2007, 01h00   #1
Membre confirmé
 
Homme
Inscription : septembre 2002
Messages : 475
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations forums :
Inscription : septembre 2002
Messages : 475
Points : 222
Points : 222
Par défaut Expression régulière qui ne fonctionne pas ?

Bonsoir,

Je récupère le code source d'une page web dans une variable puis j'execute mon expression régulière dessus afin de récupérer deux informations :
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
27
28
 
<?php
 
	function GetHTML($lien)
	{
		$source = "";
		$handle = @fopen($lien,"r");
		if($handle)
		{
			while(!feof($handle))
			{
				$source .= fgets($handle,1024);
			}
			return($source);
		}
	}
 
	$source = GetHTML("http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=LFQQ");
 
	$motif = '~<P><FONT COLOR="#48D1CC"><B>(.*)</B></FONT></P>.*<font face="courier" size = "5">(.*)</font>~';
	preg_match_all(
		$motif,
		$source,
		$tableau);
 
	echo $tableau[1][0]."\n".$tableau[2][0];
 
?>
Lorsque je place mon code HTML manuellement dans la variable $source, l'expression régulière fonctionne. Quand j'utilise ma fonction GetHTML, l'expression régulière ne fonctionne plus...

Un var_dump de ma variable $tableau nous donne ceci :
Citation:
array(3) {
[0]=>
array(0) {
}
[1]=>
array(0) {
}
[2]=>
array(0) {
}
}
Savez-vous pourquoi je rencontre ce problème et comment y remédier ?

Merci pour votre aide,
MaTHieU_
__________________
Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)
MaTHieU_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 01h21   #2
Membre confirmé
 
Homme
Inscription : septembre 2002
Messages : 475
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations forums :
Inscription : septembre 2002
Messages : 475
Points : 222
Points : 222
A force de chercher et tester un peu tout, je me suis rendu compte que le problème était causé par les sauts de ligne dans le code source, j'ai donc ajouté ça :
Code :
1
2
 
$source = str_replace(array("\r", "\n"),'',$source);
@+
MaTHieU_
__________________
Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)
MaTHieU_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 11h53   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
L'option s aurait suffit afin que le métacaractère . considére aussi les sauts de ligne (ce n'est pas le cas par défaut). Je m'étonne que vous n'ayez pas besoin de l'option U, pour rendre l'expression régulière non gourmande.

Plus d'informations dans le tutoriel : Initiation aux expressions régulières en PHP
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 12h49   #4
Membre confirmé
 
Homme
Inscription : septembre 2002
Messages : 475
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations forums :
Inscription : septembre 2002
Messages : 475
Points : 222
Points : 222
Bonjour,

Je vais essayer avec le "s" qui est plus propre.

Je ne vois pas à quoi sert le "U" ?

Citation:
"Ungreedy", c'est-à-dire non gourmand. Cela signifie que l'expression trouvera des résultats aussi petits que possible.
Merci,
MaTHieU_
__________________
Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)
MaTHieU_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 13h13   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par MaTHieU_
Je ne vois pas à quoi sert le "U" ?
Par défaut les expressions régulières (PHP en tout cas que ce soit avec les fonctions Posix - ereg* - ou PCRE - fonctions preg_*) sont dites gourmandes ou avides car elles chercheront à faire la correspondance sur la partie de la chaîne la plus longue possible. Exemple simple pour traduire une balise BBCode en HTML :
Code :
$in = preg_replace('~\{b\}(.*)\{/b\}~', '<b>\1</b>', $out);
Sans cette option ici, les balises bbcode seront mal gérées. Un texte comme : "Avant {b}gras1{/b} milieu {b}gras2{/b} fin" vous donnerait : "Avant gras1{/b} milieu {b}gras2 fin" ce qui n'est pas l'effet escompté.

L'option U n'est pas le seul moyen, on peut écrire *?, +? et ?? au lieu de respectivement *, + et ? pour rendre une partie de l'expression non avide mais il ne faut en aucun cas cumuler les deux solutions (l'option U et ces formes car leur effet en serait inversé) - à moins que cela ne soit voulu.

Faites l'essai avec/sans si cette notion reste floue
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 14h43   #6
Membre confirmé
 
Homme
Inscription : septembre 2002
Messages : 475
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations forums :
Inscription : septembre 2002
Messages : 475
Points : 222
Points : 222
Merci pour ce complément d'informations.

Je vais tester tout ça pour bien comprendre.
__________________
Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)
MaTHieU_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h03.


 
 
 
 
Partenaires

Hébergement Web