Cherchez et affichez la valeur des liens contenus dans la page HTML suivante :

    <!DOCTYPE HTML>
    <html lang="fr">
      <head>
        <title>Page</title>
        <link rel="stylesheet" href="test.css">
        <script src="fonctions.js"></script>
      </head>
      <body>
        <p>On a ici un lien sur une image <img src="images/
    	smiley.gif"> et là un lien sur une page <a href=
    	"test1/page1_a.html">page1_a.html</a></p>

        <p>Encore un lien sur une image
    	<img src="images/smiley_bad.gif"> et un lien sur
    	une page html <a href='test1/page1_a.html'>
    	page1_a.html</a></p>

        <p>On va commencer par un lien sur une page <a
        href="test1/page1_c.html">page1_c.html</a> suivi d'un
    	lien sur une image <img src="images/smiley_good.gif">
    	</p>

        <p>Un lien sur une image <img src="images/smiley.gif">
    	et un autre lien sur une image <img
    	src="images/smiley_bad.gif"></p>

        <p><a href="test2/page2_a.html">page2_a.html</a>
        lien sur une page suivi d'un lien sur une autre page
    	<a href="http://www.php.net/index.php">www.php.net</a>
    	</p>

        <p><img src="images/smiley.gif"><img src="images/
    	smiley_bad.gif"><a
    	href="http://www.nimporte.quoi/index.html"
    	target="_blank">n'importe quoi</a></p>
      </body>
    </html>

Résultat attendu

Utilisez la notation heredoc pour mettre le code HTML sous la forme d'une variable.

Les liens peuvent être contenus dans les attributs href et src des tags HTML.

Cette exercice mêle l'utilisation des tableaux et le découpage de chaînes de caractères.

Le résultat de l'extraction des liens doit être identique à la capture ci-contre.

Une solution possible

Exercice : extraire les liens d'une page HTML
<?php require('bib_fonctions.php'); $code = <<<_CODE_HTML_ <!DOCTYPE HTML> <html lang="fr"> <head> <title>Page</title> <link rel="stylesheet" href="test.css"> <script src="fonctions.js"></script> </head> <body> <p>On a ici un lien sur une image <img src="images/ smiley.gif"> et là un lien sur une page <a href= "test1/page1_a.html">page1_a.html</a></p> <p>Encore un lien sur une image <img src="images/smiley_bad.gif"> et un lien sur une page html <a href='test1/page1_a.html'> page1_a.html</a></p> <p>On va commencer par un lien sur une page <a href="test1/page1_c.html">page1_c.html</a> suivi d'un lien sur une image <img src="images/smiley_good.gif"> </p> <p>Un lien sur une image <img src="images/smiley.gif"> et un autre lien sur une image <img src="images/smiley_bad.gif"></p> <p><a href="test2/page2_a.html">page2_a.html</a> lien sur une page suivi d'un lien sur une autre page <a href="http://www.php.net/index.php">www.php.net</a> </p> <p><img src="images/smiley.gif"><img src="images/ smiley_bad.gif"><a href="http://www.nimporte.quoi/index.html" target="_blank">n'importe quoi</a></p> </body> </html> _CODE_HTML_; // On supprimer tous les caractères de saut de ligne // ou de tabulation qui sont dans le code $code = str_replace("\r", '', $code); $code = str_replace("\n", '', $code); $code = str_replace("\t", '', $code); // On stocke les liens dans un tableau associatif. // La clé est le lien et la valeur est le nombre de fois // que le lien a été trouvé dans la page. // Il y a un tableau pour les liens avec href, et un autre // pour les liens src // On découpe la chaîne dans un tableau // avec href comme séparateur et on extrait les liens $parties = explode(' href=', $code); $liensHref = extraireLiens($parties); // On découpe la chaîne dans un tableau // avec src comme séparateur et on extrait les liens $parties = explode(' src=', $code); $liensSrc = extraireLiens($parties); $liens = array_merge($liensHref, $liensSrc); htmlDebut('Extraction de liens'); // On affiche le tableau des liens // obtenus après extraction foreach($liens as $nom => $nombre) { htmlInfo($nom); echo $nombre, ' référence(s)'; } htmlFin(); //_____________________________________________ /** * Extrait les liens dans du code HTML * @param array $parts morceaux de code HTML * @return array lien => nb de fois */ function extraireLiens($parts) { $liens = array(); for ($i = 1, $iMax = count($parts); $i < $iMax; $i++){ $link = ''; $debut = $fin = 0; $carDebut = $parts[$i]{0}; $fin = strpos($parts[$i], $carDebut, 1); $link = substr($parts[$i], 1, $fin - 1); if ($link == '') { continue; // Pas de lien } if (isset($liens[$link])) { // Le lien existe déjà dans le tableau $liens[$link] ++; } else { // nouveau lien $liens[$link] = 1; } } return $liens; } ?>