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 />"; ).