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 :

[HTML PARSER] expression régulière avec preg_match_all [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 21
    Points : 15
    Points
    15
    Par défaut [HTML PARSER] expression régulière avec preg_match_all
    Bonjour à tous,

    je débute un peu dans les expressions régulières et je me confronte à un soucis.

    J'ai récupéré le code HTML d'une page web dans une variable et j'essaie de récupérer des valeurs (la définition du parser HTML quoi )

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <td bgcolor="#D4D4D4" width="72" align="center">12</td>
    <td bgcolor="#D4D4D4" width="77" align="center">12/08/10</td>
    <td width="60" align="center" bgcolor="#E7E7E7"></td>
    <td width="62" align="center" bgcolor="#E7E7E7">???</td>
    <td align="center" bgcolor="#E7E7E7">Dénominateur</td>
    J'aimerais extraire les valeurs suivantes : "12", "12/08/10", "Dénominateur"

    En gros, trouver toutes les valeurs X :

    <td bgcolor="#D4D4D4" width="72" align="center">X<
    <td bgcolor="#D4D4D4" width="77" align="center">X<
    <td align="center" bgcolor="#E7E7E7">X<

    Faut-il passer par preg_match_all pour chaque type de masque ? preg_match_all est bien la fonction a utiliser ? Quel masque utiliser ?

    Je m'y perds un peu ^^

    Merci pour votre aide !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Premier essai mais c'est un echec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $machaine = '<td bgcolor="#D4D4D4" width="72" align="center">12</td>';
     
    preg_match_all("#<td bgcolor=\"#D4D4D4\" width=\"72\" align=\"center\">([0-9]{2})</td>#", $machaine, $m);
     
    echo $m[1];

  3. #3
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('%<td[^>]*?>(.*?)</td>%si', $str, $res, PREG_PATTERN_ORDER);
    Donne
    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
    Array (
    	[0] => Array (
    		[0] => <td bgcolor="#D4D4D4" width="72" align="center">12</td>
    		[1] => <td bgcolor="#D4D4D4" width="77" align="center">12/08/10</td>
    		[2] => <td width="60" align="center" bgcolor="#E7E7E7"></td>
    		[3] => <td width="62" align="center" bgcolor="#E7E7E7">???</td>
    		[4] => <td align="center" bgcolor="#E7E7E7">Dénominateur</td>
    	)
    	[1] => Array (
    		[0] => 12
    		[1] => 12/08/10
    		[2] => 
    		[3] => ???
    		[4] => Dénominateur
    	)
    )
    EDIT : Et aussi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('%<td (?:bgcolor="#D4D4D4" width="7[2|7]" align="center"|align="center" bgcolor="#E7E7E7")>(.*?)</td>%si', $str, $res, PREG_PATTERN_ORDER)
    Donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Array (
    	[0] => Array (
    		[0] => <td bgcolor="#D4D4D4" width="72" align="center">12</td>
    		[1] => <td bgcolor="#D4D4D4" width="77" align="center">12/08/10</td>
    		[2] => <td align="center" bgcolor="#E7E7E7">Dénominateur</td>
    	)
    	[1] => Array (
    		[0] => 12
    		[1] => 12/08/10
    		[2] => Dénominateur
    	) 
    )

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 472
    Points : 121
    Points
    121
    Par défaut
    désolé de resortir le sujet mais mon problème est très proche de celui évoqué.

    Voici la chaine que j'essaye d'analyser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <td nowrap="nowrap" class="date">
    				23 sept<br>10:56
    			</td>
    Avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    preg_match_all("%<td[^>]*?>(.*)</td>%",$ligne,$tmp,PREG_PATTERN_ORDER);
    print_r($tmp);
    Et voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Array ( [0] => Array ( ) [1] => Array ( ) )
    Je ne comprend pas ou est mon erreur....je me demande si ce n'est pas à cause des sauts de ligne.
    Merci de votre aide.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    DOMDocument pour parser du HTML

  7. #7
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par samtheh
    Je me demande si ce n'est pas à cause des sauts de ligne.
    Pour prendre en compte les sauts de ligne, il faut ajouter l'option s
    %<td[^>]*?>(.*)</td>%s

    Mais entre temps, stealth35 a démontré, et ceci à plusieurs reprises, qu'il y a plus adapté...
    Citation Envoyé par stealth35
    DOMDocument pour parser du HTML
    @stealth35 : À quand un tutoriel sur DVD

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Eric2a Voir le message
    @stealth35 : À quand un tutoriel sur DVD
    en VHS

  9. #9
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Un tutoriel DOMDocument exclusivement orienté html serait en effet plus que bienvenu. DOMDocument et DOMXPath sont des outils puissants mais leur apprentissage, par ce que j'ai pu expérimenter, n'est pas vraiment évident.

    Je ne promets rien, mais si ma charge de travail le permet, j'aimerais rédiger ce tutoriel, non en qualité de spécialiste (je suis très loin de l'être), mais en tant qu'ancien débutant (pas encore véritablement pro) ayant dû, pour son premier travail en DOMDocument et DOMXPath, se heurter à pas mal de difficultés et d'incompréhensions sur un projet xhtml concret et complexe.
    Je pense donc que je saurai rédiger ce tuto en fonction.

    Mais, encore une fois, je ne promets rien.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 472
    Points : 121
    Points
    121
    Par défaut
    J'obtiens le même résultat....

    Si il y a une méthode plus adaptée je suis preneur, quand sortira le tuto évoqué ?

  11. #11
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par samtheh Voir le message
    quand sortira le tuto évoqué ?
    Bonjour,

    Ce n'est pas pour tout de suite. Il faut d'abord que je termine et livre le projet que je mentionnais dans mon intervention précédente.

    Mais je commence à y penser.

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est quand même plus compréhensible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $doc = new DOMDocument();
    $doc->loadHTML($html);
     
    $tds = $doc->getElementsByTagName('td');
     
    foreach($tds as $td) {
        var_dump($td->nodeValue);
    }
    en javascript personne ne fait des regex sur un innerHTML, on utilise l'API classique du DOM

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 472
    Points : 121
    Points
    121
    Par défaut
    Beaucoup mieux J'aime beaucoup

    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
     
    $doc = new DOMDocument();
    		$doc->loadHTML($data_brut);
     
    		$trs = $doc->getElementsByTagName('tr');
     
    		foreach($trs as $tr) {
    			//echo $doc->saveXML($tr);
     
    			echo "<tr>";
    			foreach($tr->getElementsByTagName('td') as $td) {
    				//var_dump($td->nodeValue);
     
    				echo "<td>".trim($td->nodeValue)."</td>";
     
    			}
    			echo "</tr>";
     
    		}

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    pas besoin de boucler sur le tr le td ira chercher tout les td

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

Discussions similaires

  1. Expression Régulière avec Quote
    Par jon301 dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2006, 22h08
  2. [RegEx] Expression régulière avec preg_match_all
    Par tit_oune dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 23h28
  3. Expressions régulières avec variable
    Par killprog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 17h03
  4. Expression réguliére avec CHECK
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2005, 17h38
  5. Expression régulière avec "|"
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2005, 15h09

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