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 :

preg_match trouver un bloc parmi d'autres [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut preg_match trouver un bloc parmi d'autres
    Bonjour,
    je cherche quel regex pour extraire l'unique bloc qui commence par <table> et qui fini par </table> et qui contient http://www.abcd.com/lebon parmi ceux-ci :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    $str='<table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/poiu">abcd</a><a target="_blank" href="http://www.poiu.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/lebon">abcd</a><a target="_blank" href="http://www.lebon.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/azerty">abcd</a><a target="_blank" href="http://www.azerty.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>';
     
    //j'ai essayé ce qui suit mais ça me renvoi toutes les tables :
     
     
    $link="http://www.abcd.com/lebon";
     
    $slash2p = array("/", ":");
    $slash2pok   = array("\/", "\:");
     
    $linkok = str_replace($slash2p , $slash2pok , $link);
     
    	if(preg_match("#<table(.*?).*".$newlink.".*</table>#is", $str, $matches))
    {
        echo '<pre>' . htmlentities(print_r($matches, true)) . '</pre>';
    }
    et surtout je veux pas faire de boucle pour trouver le résultat, preg_match doit me renvoyer l'unique bloc table qui contient http://www.abcd.com/lebon
    ça doit pas être très compliqué mais je cale un peu.

    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 96
    Points
    96
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<table.*?http://www.abcd.com/lebon.*?</table>#'
    Edit : Ne marche pas...

    a revoir : ne pas retrouver <table> avant l'url.

    Je lance une série de tests

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    et non je vais là-dessus pour tester :
    http://lumadis.be/regex/test_regex.php

    et avec ton expression ça ne renvoi rien :
    il faut au moins la mettre comme ça #<table.*?http://www.abcd.com/lebon.*?</table>#s
    mais ça reviens à celle que j'avais donné
    je test ça :
    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
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>   
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/poiu">abcd</a><a target="_blank" href="http://www.poiu.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/lebon">abcd</a><a target="_blank" href="http://www.lebon.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #<table.*?http://www.abcd.com/lebon.*?</table>#s
    me renvoi l'ensemble alors que je voudrai obtenir que ça:
    Code html : 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
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
    <tbody><tr>
    <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    <td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    </tr>
    <tr>
    <td valign="top" class="Nat">FR</td>
    </tr>
    <tr>
    <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    </tr>
    <tr>
    <td class="Links">
    <a target="_blank" href="http://www.abcd.com/lebon">abcd</a><a target="_blank" href="http://www.lebon.com/">site</a>
    </td>
    </tr>
    </tbody></table>

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 96
    Points
    96
    Par défaut
    Oui oui j'ai vu par contre j'avais pas vu qu'il y avait ta regexp à la fin du code XD

    Par contre la regexp conditionnelle c'est pas trop mon truc :s

    Tu peux proceder autrement... Je te proposerai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pos = strpos($str,'<table');
    while (strpos($str,'<table',$pos) < strpos($str,'http://www.abcd.com/lebon',$pos)) {
    $pos = strpos($str,'<table',$pos);
    }
     
    $end = strpos($str,'</table>',$pos);
    $table = substr($str,$pos,($end-$pos+9));

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    et oui mais non je veux pas faire de boucle je peux avoir 100 tables identiques.
    je viens d'essayer ça :
    #(?!.+<table.*)<table.*?http://www.abcd.com/lebon.*?</table>#s

    et ça à l'air de marcher sur ça :
    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
    29
    30
    31
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>   
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/poiu">abcd</a><a target="_blank" href="http://www.poiu.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/lebon">abcd</a><a target="_blank" href="http://www.lebon.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    </tbody></table>
    </tbody></table>
    il me renvoi bien la partie que je souhaite.
    Si quelqu'un peut valider que ça va pas créer des bugs...

    Merci

  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
    pour parser du HTML c'est DOMDocument ...

  7. #7
    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
    Bonsoir,

    L'insistance de Stealth pour parser du html avec DOMDocument va peut-être progressivement porter ses fruits

    Pour ma part, je commence à m'y mettre et à un peu comprendre la logique de cette API (voir mon ajout d'aujourd'hui à mon post "Parser à l'aide de DOM..."), mais suis encore peu convaincu qu'il faille systématiquement utiliser DOMDocument (et son acolyte XPath, ou SimpleXML), même si intellectuellement cette démarche puisse sembler plus rigoureuse et plus cohérente que l'utilisation dévoyée de regex.

    Comme je l'écrivais dans mon post, peut-être est-ce une question de "rentabilité" : il y a des éléments qui peuvent être repérés sans équivoque à l'aide d'une regex relativement simple ; pour d'autres il vaut mieux utiliser DOMDocument (qui peut parfois être la seule solution fiable).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Dom document me permet pas de chercher une expression sans boucler sur toute la page. Si ? Je peux pas me permettre de faire des foreach...
    bon sinon ce que j'ai trouvé : #(?!.+<table.*)<table.*?http://www.abcd.com/lebon.*?</table>#s
    c'est pas encore ça ça marche plus avec :
    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
    29
    30
    31
    32
    33
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>   
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/poiu">abcd</a><a target="_blank" href="http://www.poiu.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>
        <td width="10" valign="top" class="img" rowspan="4"><a rel="" class="ceebox" href="3945.jpg"><img border="0" alt="nom" src="3945_mini.jpg"/></a></td>
    		<td valign="top" height="16"><span style="color: rgb(5, 171, 239);" class="nom">nom</span> <span class="Style">genre</span></td>
    	</tr>
    	<tr>
        <td valign="top" class="Nat">FR</td>
    	</tr>
    	<tr>
        <td valign="top" class="Bio"><p>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."
    Tunc dialecticus corrigit : "Minime, tantum asserere possumus in Anglia exstitisse unam saltem ovem, per paucas secundas dumtaxat, quae nigra erat in una saltem pariete."</p></td>
    	</tr>
    	<tr>
        <td class="Links">
    			<a target="_blank" href="http://www.abcd.com/lebon">abcd</a><a target="_blank" href="http://www.lebon.com/">site</a>
    		</td>
    	</tr>
    </tbody></table>
     
    <table width="100%" cellspacing="0" cellpadding="0" border="0" class="tab">
      <tbody><tr>  
    </tbody></table>
    Nothing found !

  9. #9
    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 flashub Voir le message
    Dom document me permet pas de chercher une expression sans boucler sur toute la page. Si ?
    si

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $doc = new DOMDocument();
    $doc->loadHTMLFile('test.html');
     
    $xpath = new DOMXpath($doc);
    $query = $xpath->query(sprintf('//*[@*="%s"]/ancestor::table', 'http://www.abcd.com/poiu'));
     
    $temp = new DOMDocument();
     
    foreach($query->item(0)->childNodes as $node) {
        $temp->appendChild($temp->importNode($node, true));
    }
     
    echo $temp->saveHTML();

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Ouahou c'est magnifique cette notation
    Je connaissais pas sprintf je découvre
    La puissance du DOMDocument.
    Bravo

    Franchement c'est magnifique, je suis scotché et il me reste beaucoup de chose à apprendre

    Merci beaucoup

  11. #11
    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 flashub Voir le message
    Ouahou c'est magnifique cette notation
    Je connaissais pas sprintf je découvre
    La puissance du DOMDocument.
    Bravo

    Franchement c'est magnifique, je suis scotché et il me reste beaucoup de chose à apprendre

    Merci beaucoup
    si tu veux plus d'explications n'hésite pas

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    j'avoue que j'ai du mal à décrypter : *[@*="%s"]
    %s je pense que c'est 'http://www.abcd.com/poiu'
    mais *[@*= ça veux dire tout ce qui a autour de %s ? et ancestor::table limité à la balise table ?

  13. #13
    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 flashub Voir le message
    j'avoue que j'ai du mal à décrypter : *[@*="%s"]
    %s je pense que c'est 'http://www.abcd.com/poiu'
    mais *[@*= ça veux dire tout ce qui a autour de %s ? et ancestor::table limité à la balise table ?
    c'est du Xpath :
    //*[@*="%s"]/ancestor::tablen’importe quelle nœud a partir de l'importe ou (//*)
    dont n'importe quelle attribute est égale a (ici l'url) ([@*=truc])
    on prend sélectionne l’ancêtre de ce dernier donc ici c'est table

    imagine que dans ton code tu souhaites tout les liens de la classe "img"

    tu feras

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $doc = new DOMDocument();
    $doc->loadHTMLFile('test.html');
     
    $xpath = new DOMXpath($doc);
    $query = $xpath->query(sprintf('//*[@*="%s"]/ancestor::table', 'http://www.abcd.com/poiu'));
     
    $temp = new DOMDocument();
     
    foreach($query->item(0)->childNodes as $node) {
        $temp->appendChild($temp->importNode($node, true));
    }
     
    echo $temp->saveHTML();
    cette notation marche très bien mais j'ai beau cherché je ne vois que peu d'exemple avec ancestor et sprintf
    supposons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="aa">text ok </div> <div class="bb"><img class="cc" src="ii.jpg" width="82" height="80" alt="" title="" /><span class="dd"></span><h1>poiu</h1><h2>Physicus quidam, mathematicus et Dialecticae peritus una tramine vehuntur ut Londinium petant. Cum e cuniculo discedant, ovem nigram per fenestram cernunt. Physicus illa dicit : "Hem ! Omnes oves anglicae nigrae sunt." Mathematicus corrigit : "Minime, Tantum autumare possumus in Anglia exstare unam saltem ovem quae nigra est."</h2><span class="ee"><a href="http://www.abcd.com/poiu" target="_blank alt="poiu  title=poiu " >http://www.abcd.com/poiu</a></span></div>
    à l'aide de la même technique je veux récupérer en prenant <h1>poiu</h1> comme recherche:
    1. le contenu de la div : <div class="bb">...</div>
    2. l'ensemble du bloc de <div class="aa"> à </div> de fin ?

    comment faire ?
    $query = $xpath->query(sprintf('//h1->nodeValue="%s"/ancestor::div', 'poiu')); ne marche évidement pas...

  15. #15
    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
    il va falloir faire 2 requêtes, et le <h1> et <div class="aa">, ne sont pas dans le même nœud,
    le xpath c'est pas du PHP donc nodeValue ne marche pas

    pour la doc de xpath
    http://www.w3.org/TR/xpath/

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    alors juste pour le nœud ancêtre : <div class="bb"> pour donner une idée ?

  17. #17
    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 flashub Voir le message
    alors juste pour le nœud ancêtre : <div class="bb"> pour donner une idée ?
    //h1[text()="poiu"]/ancestor::div

  18. #18
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    pour parser du HTML c'est DOMDocument ...
    Ou SimpleXML, qui est plus... simple
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  19. #19
    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 s.n.a.f.u Voir le message
    Ou SimpleXML, qui est plus... simple
    non parce que HTML != XML

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    //h1[text()="poiu"]/ancestor::div
    merci beaucoup ça marche nickel.
    franchement j'ai eu beau chercher j'avais pas trouvé text(), aaah le vocabulaire

    bon alors comment remonter au div <div class="aa">text ok </div> au dessus ? J'en demande trop ?
    pas grave sinon je vais trouver.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RCP] Trouver une vue dans une autre perspective
    Par Nikk0 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 29/03/2007, 10h27
  2. problème variable d'un bloc a un autre
    Par michael urbain dans le forum C++
    Réponses: 5
    Dernier message: 03/10/2006, 23h44
  3. [VBA]Trouver les cellules fusionnées et autres
    Par SFrane dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 23/01/2006, 13h12
  4. Réponses: 23
    Dernier message: 05/01/2006, 20h15
  5. [langage] trouver une variable dans une autre
    Par BEAUJAULT dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2004, 15h04

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