PHP (PHP Hypertext Preprocessor)

Auteur: Mohamed CHINY Durée necessaire pour le cours de PHP (PHP Hypertext Preprocessor) Niveau recommandé pour le cours de PHP (PHP Hypertext Preprocessor) Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz disponible pour ce cours

Page 18: Exercice - Identification des URL et liens cliquables

Toutes les pages

Enoncé

On voudrait créer un formulaire qui contient un espace de texte destiné à accueillir les commentaires des visiteurs et un bouton d'envoi. Le fait de cliquer sur le bouton reproduit le message saisi dans l'espace de texte en bas du formulaire. Cependant, si le texte contient une adresse d'un site web (FQDN ou URL), celui ci sera cliquable.

Par exemple, si le client saisie le message:
le moteur de recherche le plus populaire est www.google.com,
on reproduira en bas du formulaire le texte:
le moteur de recherche le plus populaire est <a href="http://www.google.com" target="_blank">www.google.com</a>
ou encore, si le texte est:
http://www.facebook.com est l'URL qu'il faut saisir
alors il sera affiché:
<a href="http://www.facebook.com" target="_blank">www.facebook.com</a> est l'URL qu'il faut saisir.

Bien entendu, le navigateur interprétera les balises <a> pour que le texte soit cliquable.

Correction

Voici ma version de code:
<?php
   @$comm=$_POST["comm"];
   @$valider=$_POST["valider"];
   $commt="";
   if(isset($valider)){
      $tabl=explode("\n",$comm);
      foreach($tabl as $ligne){
         $tabm=explode(" ",$ligne);
         for($i=0;$i<count($tabm);$i++){
            if(preg_match("#^www.#",$tabm[$i]))
               $tabm[$i]='<a href="http://'.$tabm[$i].'" target="_blank">'.$tabm[$i].'</a>';
            elseif(preg_match("#^http://#",$tabm[$i]))
               $tabm[$i]='<a href="'.$tabm[$i].'" target="_blank">'.$tabm[$i].'</a>';
            $nligne=implode(" ",$tabm);
         }
         $commt.=$nligne."<br />";
      }   
   }
?>
<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <style>
         *{
            font-family:arial, sans-serif;
            color:#888888;
         }
         textarea{   
            border:solid 1px #EE6600;
            padding:10px;
            outline:none;
         }
         input{
            background-color:#EE6600;
            color:#FFFFFF;
            padding:10px;
            border:none;
            outline:none;
         }
         a{
            color:#EE6600;
            text-decoration:none;
         }
         a:hover{
            text-decoration:underline;
         }
      </style>
   </head>
   <body>
      <form name="fo" method="post" action="">
         <textarea name="comm" cols="50" rows="6">
         </textarea><br />
         <input type="submit" name="valider" value="Valider le commentaire" /><br />
      </form>
      <?php
         echo $commt;
      ?>
   </body>
</html>
L'objectif est de distinguer les mots qui commencent par www. ou http://. Alors on doit d'abord diviser le texte contenu dans le textarea au niveau des retours à la ligne (\n). On obtient alors le tableau $tabl qui contient les lignes du texte une à une ( $tabl=explode("\n",$comm); ). On divise ensuite chaque ligne en mots en l'éclatant au niveau des espaces ( $tabm=explode(" ",$ligne); ). Désormais que nous disposons des différents mots, on peut vérifier si ceux ci commencent par www. ou http://.

Après avoir modifié les mots qui commencent par les occurrences recherchées en leur ajoutant la balise <a>, on reconstitue la ligne à partir des mots ( $nligne=implode(" ",$tabm); ) puis le texte à afficher à partir des lignes reconstituées ( $commt.=$nligne."<br />"; ).