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 :

Expression régulière qui ne fonctionne pas ? [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    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 : 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
     
    <?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 :
    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)

  2. #2
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $source = str_replace(array("\r", "\n"),'',$source);
    @+
    MaTHieU_
    Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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

  4. #4
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Bonjour,

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

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

    "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)

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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

  6. #6
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    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)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Expression régulière qui ne marche pas ?
    Par [ZiP] dans le forum Débuter
    Réponses: 4
    Dernier message: 29/06/2010, 14h42
  2. [RegEx] expression régulière qui marche pas et pourtant
    Par bigs3232 dans le forum Langage
    Réponses: 6
    Dernier message: 19/03/2010, 17h29
  3. [Regex] Expression régulière qui ne passe pas avec \.
    Par jsd03 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 10/03/2009, 16h49
  4. Regular expression qui ne fonctionne pas
    Par Remedy dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 16h52
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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