Suite à cette vidéo :
http://www.grafikart.fr/tutoriels/php/html-parser-php-158

Je souhaites faire une parseur PHP.

Seulement, J'aimerais s’accéder seulement au premier noeud trouvé.

Exemple :

<article itemtype="http://schema.org/Article">
    <span itemprop="name">Titre 1</span>
        <article itemtype="http://schema.org/Article">
            <span itemprop="name">Titre 2</span>
        </article>
</article>
<article itemtype="http://schema.org/Article">
    <span itemprop="name">Titre 3</span>
        <article itemtype="http://schema.org/Article">
            <span itemprop="name">Titre 3</span>
        </article>
</article>

J'aimerais récupérer le premier article ( Titre 1 ) et le 3ème article ( Titre 3 ).

Sans leurs enfants donc.

Mon code est :

<?php 
$html = file_get_html('test.html');
$json=array();
foreach($html->find('[itemtype="http://schema.org/Article"]') as $element){
    $t++;
       $json$t]$k]$element->find('[itemprop="name"]',0)->pleintext;
}

?>

Merci d'avance,
Ener-Getick

3 réponses


iriven
Réponse acceptée

bonjour essaye ceci:

function get_tag_content( $tag, $html ) {
  $tag = preg_quote($tag);
  preg_match_all('{<'.$tag.'^>]*>(.*?)</'.$tag.'>.'}',
                   $html,
                   $matches,
                   PREG_PATTERN_ORDER);
  return $matches[1];
}

si tu souhaite faire une recherche sur une balise avec un attribut particulier, tu peux faire:

$tag=array( 'name'=>'span', //ex: div, table, p,section....
                'attr'=>array( 'name'=>'itemprop', // ex: id, class, style.....
                                'value'=>'name'
                            )
        );
function get_tag_content( $tag, $html ) {
  if( is_null($tag'name']) )
    $tag'name'] = '\w+';
  else
    $tag'name'] = preg_quote($tag'name']);
  $attr = preg_quote($tag'attr']'name']);
  $value = preg_quote($tag'attr']'value']);
  $tag_regex = "/<(".$tag'name'].")^>]*$attr\s*=\s*".
                "('\"])$value\\2^>]*>(.*?)<\/\\1>/"
  preg_match_all($tag_regex,
                 $html,
                 $matches,
                 PREG_PATTERN_ORDER);
  return $matches[3];
}

Merci beaucoup ça marche !! :)

Je n'avais pas pensé d'y faire comme ça.

Ener-Getick

pas de quoi