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 :

Fonction preg_match renvoie vide avec : (bla)? [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Fonction preg_match renvoie vide avec : (bla)?
    Bonjour,

    J'ai l'expression régulière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if( preg_match('`.*<td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td><td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td>(<td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td>)?.*</tr>.*<td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td><td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td>(<td><div class="cell"><div class="pictoicon"><div title=".*" class="picon p(.*)"></div></div></div></td>)?.*</tr>.*<td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td><td><div class="cell"><div class="glyph winddir (.*)"></div></div></td>	</tr>.*<td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td><td><div class="cell">(.*)</div></td>(<td><div class="cell">(.*)</div></td>)?.*</tr>.*`Uis', $page, $resultats) )
    	{
    		echo 'Nombre : '.count($resultats).'<br/>';
    		for( $i=1; $i<=count($resultats); $i++ )
    		{
    			if( !empty($resultats[$i]) )
    			{
    				echo $resultats[$i].'<br/>';
    			}
    		}
    	}
    Pour la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (<td><div class="cell"><time datetime="(.*)">.*<span class="up">00</span></time></div></td>)?
    Mon tableau $resultats contient systématiquement une ligne vide que cette partie existe ou non.

    Est-ce normal ?

    Je préfèrerai que mon tableau ait une taille correspondant au nombre de données récupérées...

    Merci,
    ZiP

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    C'est normal, c'est le comportement d'un quantificateur non gourmand (non-greedy) ou paresseux (lazy). Si tu écris: ~(foo)??.*?bar~ ce qui correspond à ~(foo)?.*bar~U (le modificateur U inverse le comportement des quantificateurs).

    (foo) ne sera jamais cherché car (foo)?? signifie: cherche (foo) uniquement si c'est nécessaire à la réussite de la pattern.

    Comme ce qui suit .*? n'offre aucune contrainte particulière, cette nécessité ne se fera jamais sentir. Par contre .*?, puisqu'il est suivi d'une contrainte (il doit parvenir jusqu'à "bar") matchera tous les caractères de "foo" (inclus) jusqu'à "bar" (exclu).

    Concernant ton approche:

    Tu n'utilises absolument pas le bon outil pour extraire des données d'une page html. Tu obtiendras plus efficacement tes résultats en utilisant DOMDocument et DOMXPath. Même si ton projet est avancé, n'hésite pas à prendre le temps de revenir en arrière, voire de refaire tout ton code pour préférer ces technologies.
    Une recherche dans du code html à coup de regex peut être pertinente dans un certain contexte (dépendant du nombre d'informations à chercher, de la fiabilité et du format de la source, de la taille de la source et de la complexité/profondeur de l'arbre DOM). Mais là, ce n'est clairement pas le cas.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonsoir,

    Merci pour ces conseils, je vais me documenter.

    ZiP

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

Discussions similaires

  1. Problème avec fonction preg_match
    Par lebanner82 dans le forum Langage
    Réponses: 5
    Dernier message: 23/03/2012, 04h08
  2. Réponses: 8
    Dernier message: 22/12/2009, 16h20
  3. Réponses: 5
    Dernier message: 25/09/2006, 11h06
  4. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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