Extraire du texte entre 2 balises avec php

Sébastien
Invité n'ayant pas de compte PHPfrance

16 mars 2013, 19:10

Bonjour à vous tous,
J'ai un petit soucis.

J'ai récupéré ce code sur Internet (http://www.commentcamarche.net/forum/af ... s-avec-php)
<?php
$source = '<a href="/siteinfo/page1.html">Coco</a>
<a href="/siteinfo/page2.html">Riri</a>
<a href="/siteinfo/page3.html">Dada</a>';

preg_match_all('#<a href="(.+)">(.+)</a>#i', $source, $liens);

$nb = 0;
foreach($liens[0] as $complet) {
    $url = $liens[1][$nb];
    $texte = $liens[2][$nb];

    echo 'Lien complet : '.htmlspecialchars($complet).'<br />';
    echo 'URL : '.$url.'<br />';
    echo 'Texte : '.$texte.'<br />';
    echo '<hr />';

    $nb++;
}
?>

Il marche à la perfection...
Mais j'aimerai en plus pouvoir récupérer ce qu'il y a entre les balises liens... Je m'explique.

Imaginons le texte "source" ainsi :
<a href="/siteinfo/page1.html">Coco</a>... Récupérer tout ici...
<a href="/siteinfo/page2.html">Riri</a>... Et ici...
<a href="/siteinfo/page3.html">Dada</a>... Et là...
Comment récupérer tous ce qui se trouve entre les balises "<a>" !?
cela : "... Récupérer tout ici..."
et cela :"... Et ici..."
Et encore :"... Et là..."

Merci de votre aide.
DJ

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 mars 2013, 22:05

Bonjour, essaye cette RegExp:
preg_match_all('#</a>([^<]*)#i', $source, $liens);
C'est à dire : on sélectionne le contenu situé après </a> jusqu'à rencontrer un < qui annonce la présence d'une autre balise (ou rien comme l'atteste l'étoile *)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Sébastien
Invité n'ayant pas de compte PHPfrance

17 mars 2013, 11:32

Bonjour Sadeq,
Merci de ta réponse.

Je me demandais si il était possible d'inclure ce nouvel RegExp à l'ancien.
Et ainsi avoir avec seulement un RegExp toutes les infos nécessaires.

Avec quelque chose comme cela :
preg_match_all('#<a href="(.+)">(.+)</a>(.+)#i', $source, $liens);
Mais cela semble ne pas fonctionner !?
Je n'arrive pas à récupérer :
$liens[4][$nb];
qui correspond au dernier " (.+) "...
Je n'arrive pas à l'inclure dans ma boucle " foreach " !?

Merci
DJ

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

17 mars 2013, 23:08

Oui comme ça :
preg_match_all('#<a href="(.+)">(.+)</a>([^<]*)#i', $source, $liens);
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 120 Messages

18 mars 2013, 10:48

Les expressions régulières sont des outils inadéquats pour ça.
http://php.net/DOMDocument

Sébastien
Invité n'ayant pas de compte PHPfrance

18 mars 2013, 11:35

Bonjour Sadeq,
Merci de ta réponse...
Cela fonctionne ! :o)

Bonjour Perine,
Je ne connais pas les "DOMDocument", et je suis allé voir sur le lien... pffff mazette ! Pas une mince affaire ...

Merci quand même ;o)

DJ