Convertir les URL en liens cliquables

Convertir les URL en liens cliquables - PHP - Programmation

Marsh Posté le 07-06-2006 à 12:36:13    

Bonjour,
 
Je viens de découvrir ce forum et j'espère que l'un de vous pourra m'aider, car cela fait plusieurs semaines que j'essaie de trouver une solution, mais sans succès.
 
J'aimerais convertir automatiquement les URL (entrées dans des textarea) en liens cliquables dans ma page details.php.
 
Voici le code que j'ai mis dans ma page detail.php pour afficher l'un des champs:

Code :
  1. <?=nl2br(htmlentities($result['commentairest']));?>


J'ai mis nl2br, car je voulais garder les retours à la ligne entrés dans le formulaire
 
Mais comment puis-je lui dire qu'il convertisse les URL en lien cliquable ?
 
J'ai vu qu'on pouvait le faire avec eregi_replace, mais je ne sais pas où je dois le mettre et comment…
 
Il faut aussi prendre en considération que certaines URL seront très longues, dont il faudrait les couper, pour éviter que cela décale tout le design.
 
J'ai essayé de mettre  
 

Code :
  1. <?=nl2br(wordwrap($result['div_liens'], 70,"\n",TRUE));?>


qui fonctionne, mais je pense que cela ne marchera plus si je convertis les URL en liens cliquable, car le <BR> posera problème.
 
Pouvez-vous m'aider ?
 
Merci d'avance et A+

Reply

Marsh Posté le 07-06-2006 à 12:36:13   

Reply

Marsh Posté le 07-06-2006 à 12:51:18    

Reply

Marsh Posté le 07-06-2006 à 14:20:57    


 
Merci pour l'info, mais comment puis-je combiner mon code avec cette fonction ?
 
J'ai essayé la fonction toute seule et elle marche, mais je n'ai plus mes retours à la ligne.
 
De plus, avec cette fonction, si j'ai une URL longue, du style http://www.monsite.com/aaaaaa/bbbbb/cccc/ddd.html, il me met le lien que sur http://www.monsite.com et pas sur toute l'URL.
 
Et l'URL n'est pas coupée, donc cela décale mon design.  
 
 
 

Reply

Marsh Posté le 07-06-2006 à 17:38:13    

En fait, j'ai trouvé comment avoir le lien sur toute l'URL à http://www.expreg.com/voir63.
 
Et je l'ai mis comme cela :

Code :
  1. <?php
  2. function clicklien($url){ 
  3. $in=array( 
  4.     '`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', 
  5.     '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'  
  6.     ); 
  7. $out=array( 
  8.     '<a href="$1">$1</a>', 
  9.     '<a href="http://$1">$1</a>'
  10.     ); 
  11. return preg_replace($in,$out,$url); 
  12. }
  13.  
  14. echo clicklien($result['div_liens']); 
  15. ?>


Mais maintenant, comment puis-je lui dire de :
1) garder les retours à la ligne, s'il y en a
2) appliquer une césure sur une URL trop longue
 
Est-il possible de combiner 2 fonctions et si oui comment.
 
J'ai également trouvé la fonction pour la césure à cette adresse : http://www.expreg.com/voir62
 
Mon problème est que je ne sais pas comment je peux combiner ces 2 fonctions.
 
Pouvez-vous m'éclairer ?
 
Merci d'avance
 
et merci également à zapan666 pour le lien qui m'a permis d'y voir plus clair !

Reply

Marsh Posté le 07-06-2006 à 18:03:24    

Code :
  1. <?php
  2.  
  3. function pouet1($match){
  4. return '<a href="'.$match[1].'">'.substr($match[1],0,15).'...'.substr($match[1],-1,3).'</a>';
  5. }
  6.  
  7. function pouet2($match){
  8. return '<a href="http://'.$match[1].'">'.substr($match[1],0,15).'...'.substr($match[1],-1,3).'</a>';
  9. }
  10.  
  11. function clicklien($url){  
  12.    $in=array(  
  13.       '`((?:https?|ftp)://\S+[[:alnum:]]/?)`si',  
  14.       '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'
  15.       );  
  16.    $out=array(  
  17.       'pouet1',  
  18.       'pouet2'
  19.       );  
  20.    return preg_replace_callback($in,'pouet',$url);  
  21. }
  22.    
  23. echo clicklien($result['div_liens']);  
  24. ?>


Bon, ce n'est qu'une idee mais essaye ca.
 
 
Je me base sur le fait que dans la doc c'est ecrit :

Citation :

The behavior of this function is almost identical to preg_replace()


http://uk.php.net/manual/en/functi [...] llback.php
 
Car le truc qui me pose probleme, c'est les parametres : si on peut les passer en tableau ou pas.
 
Si ca marche, met un p'tit message, ca peut m'interesser :D


Message édité par zapan666 le 07-06-2006 à 18:04:15

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 07-06-2006 à 18:57:52    

Merci zapan666,
 
Mais malheureusement cela ne marche pas... Dommage.
 
Cela ne donne pas d'erreur, mais les infos du champ en question ne s'affichent plus...
 

Reply

Marsh Posté le 07-06-2006 à 21:56:37    

non mais en fait, je me suis trompé dans mon exemple. (tu aurais du avoir un warning, car je passais pas $out comme parametre...)
 
 
J'ai trouvé quelque chose qui a l'air de bien marché :  

Code :
  1. <?php
  2.    
  3.     function pouet1($match){
  4.     if (strlen($match[0]) > 15) {
  5.     return '<a href="'.$match[1].'">'.substr($match[1],0,15).'...'.substr($match[1],-10,10).'</a>';
  6.    } else {
  7.    return '<a href="'.$match[1].'">'.$match[1].'</a>';
  8.     }
  9.    } 
  10.     function clicklien($url){ 
  11.        $in=array( 
  12.           '`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', 
  13.           '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'  
  14.           ); 
  15.        $out = 'pouet1';
  16.        return preg_replace_callback($in,$out,$url); 
  17.     }
  18.        
  19. clicklien($blabla); 
  20.     ?>


Message édité par zapan666 le 07-06-2006 à 21:57:13

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 07-06-2006 à 23:14:02    

Super !!!
 
zapan666, un très grand MERCI, ça marche !!! (sauf si on a uniquement le www. et pas le http:// devant).  
 
J'ai aussi ajouté le echo qui manquait à la ligne 19.
 
Et pour cette ligne 19, j'ai mis le code suivant, car je voulais garder les retours à la ligne, mais je ne suis pas sûre que ce soit correct

Code :
  1. echo clicklien(nl2br(htmlentities($result['div_liens'])));


ça marche, sauf certaines fois ou j'ai des <br qui se rajoutent dans le code, s'il y a un retour à la ligne juste après l'URL.
Est-il possible de corriger cela ?
 
Juste encore une petite chose qui me pose un problème :
 
Tout fonctionne correctement si j'affiche uniquement une fiche à la fois, mais si je veux afficher 2 fiches ou plus sur la même page, là il y a un problème et la page ne s'affiche pas correctement. Le tableau (mon code se trouve dans un tableau bien sûr) est décalé. La 1ère fiche sort bien, mais la 2ème n'est pas entière et s'arrête juste avant l'endroit où j'ai mis mon code. Le tableau n'est pas complet.
 
Une idée de ce qui provoque ce problème ?
 
et encore 1000 x MERCI...


Message édité par Cindy21 le 07-06-2006 à 23:41:17
Reply

Marsh Posté le 07-06-2006 à 23:35:26    

Tu as peut être un espace en trop avant ou après dans ton champ commentaire

Code :
  1. $tmp = trim($result['commentaires']);
  2. if (!empty($tmp)) {


 
note :  

Code :
  1. if (!empty(trim($variable)) {


génère une erreur, je pige pas trop pourquoi...
 
 
\o/ 3-1 pour la France \o/


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 07-06-2006 à 23:46:13    

Non, en fait le problème ne vient pas de la ligne avec les commentaires.
 
Je m'en suis rendue compte après avoir fait plusieurs tests.
 
J'ai édité mon précédent message, car je me suis apperçue que c'était si l'on affichait plusieurs fiches en même temps que l'on avait le problème.  

Reply

Marsh Posté le 07-06-2006 à 23:46:13   

Reply

Marsh Posté le 08-06-2006 à 00:00:28    

Tu n'enchaine pas les fonctions dans le bon ordre je pense

Code :
  1. echo nl2br(clicklien(htmlentities($htmleux)));


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 08-06-2006 à 00:23:30    

zapan666 a écrit :

Tu n'enchaine pas les fonctions dans le bon ordre je pense

Code :
  1. echo nl2br(clicklien(htmlentities($htmleux)));



Ca ne marche pas non plus et en plus cela me donne une page blanche.
 
Mais en fait ce n'est pas le nl2br qui pose problème, car j'ai essayé sans, en mettant juste le code  

Code :
  1. echo clicklien($result['div_liens']);

et j'ai aussi le problème. Le tableau est tronqué s'il y a plus d'une fiche...
 
Est-ce la function pouet1 qui pose un problème, car avec plus d'une fiche, elle est répétée ?
 
Et pourtant on est si prêt du but...

Reply

Marsh Posté le 08-06-2006 à 00:28:29    

Tu peux fournir un exemple où ça ne marche pas ?  
 
Mais c'est peut être la fonction pouet1 qui ne marche effectivement pas :D


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 08-06-2006 à 00:41:37    

zapan666 a écrit :

Tu peux fournir un exemple où ça ne marche pas ?  
Mais c'est peut être la fonction pouet1 qui ne marche effectivement pas :D


Je n'ai qu'une URL locale pour l'instant. Mais je peux poster le code, si besoin.
 
Je me disais qu'il faudrait peut-être que je mette cette fonction dans un include à part qui ne soit pas directement dans la page.
 
Mais je ne sais pas trop comment faire... et surtout si cela a un sens.
 

Reply

Marsh Posté le 08-06-2006 à 10:25:43    

C'est surtout le

Citation :

et j'ai aussi le problème. Le tableau est tronqué s'il y a plus d'une fiche...
 
Est-ce la function pouet1 qui pose un problème, car avec plus d'une fiche, elle est répétée ?


C'est quoi le tableau ? C'est quoi ces fiches ?


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 08-06-2006 à 13:01:19    

Alors voici comment ça marche :
 
- j'ai une page avec un formulaire que les internautes peuvent remplir et les données sont enregistrées dans la BD
- j'ai une page "search" pour faire une recherche par mot clé
- j'ai une page "resultats" qui affiche tous les résultats de la recherche avec une case à cocher pour chaque donnée
- j'ai une page "afficher" qui affiche les "fiches ou les données" en question. Il y a 2 possibilités :
a) dans ma page de résultats, si je clique sur l'un des liens, seule la fiche choisie est affichée
b) dans ma page de résultats, si je coche plusieurs cases, la page "afficher" met toutes les fiches sur la même page, les unes sous les autres.
 
Voici la partie du code en question de ma page "afficher.php"

Code :
  1. <table width="100%"  border="0" align="center" cellspacing="1">
  2.   <?php
  3. $i=1;
  4. foreach ($display as $id) {
  5. $result=db_query("SELECT * FROM titre WHERE id='".$id."' LIMIT 1" );
  6. $result=db_fetch_array($result);
  7. ?>
  8.   <tr>
  9.     <td align="left" colspan="2">
  10.       <table  border="0" cellspacing="3" cellpadding="0" width="80%">
  11.         <tr>
  12.           <td width="20%">Pays :</td>
  13.           <td width="80%"><?=$result['pays'];?></td>
  14.         </tr>
  15.         <tr>
  16.           <td width="20%">Titre :</td>
  17.           <td width="80%"><?=$result['titre'];?></td>
  18.         </tr>
  19.         <tr>
  20.           <td width="20%">Liens :</td>
  21.           <td width="80%">
  22.             <?=nl2br(htmlentities($result['liens']));?>
  23.           </td>
  24.         </tr>
  25.              <tr>
  26.           <td width="20%">Sources web :</td>
  27.           <td width="80%">
  28.             <?php          function pouet1($match){
  29.     if (strlen($match[0]) > 60) {
  30.    return '<a href="'.$match[1].'"  target="_blank">'.substr($match[1],0,60).'...'.substr($match[1],-10,10).'</a>';
  31.    }
  32. else {
  33.   return '<a href="'.$match[1].'" target="_blank">'.$match[1].'</a>';
  34.      }
  35.   } 
  36.    function clicklien($url){ 
  37.        $in=array(            '`((?:https?|ftp)://\S+[[:alnum:]]/?)`si',            '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'           );  
  38.         $out = 'pouet1';       return preg_replace_callback($in,$out,$url);
  39.       } 
  40.                echo clicklien(nl2br(htmlentities($result[''div_liens''])));
  41. ?>
  42.           </td>
  43.         </tr>
  44.         <tr>
  45.           <td width="20%">Autres sources :</td>
  46.           <td width="80%">
  47.             <?=nl2br(htmlentities($result['autres_sources']));?>
  48.           </td>
  49.         </tr>
  50.         <tr>
  51.           <td width="20%">&nbsp;</td>
  52.           <td width="80%">&nbsp;</td>
  53.         </tr>
  54.         <?php if (!empty($result['commentaires'])) { ?>
  55.         <tr>
  56.           <td width="20%">Commentaires :</td>
  57.           <td width="80%">
  58.             <?=nl2br(htmlentities($result['commentaires']));?>
  59.           </td>
  60.         </tr>
  61.         <?php } ?>
  62.       </table>
  63.       <br>
  64.     </td>
  65.   </tr>
  66.   <?php  $i++; }  ?>
  67. </table>


Message édité par Cindy21 le 08-06-2006 à 14:13:19
Reply

Marsh Posté le 08-06-2006 à 14:30:26    

Pour afficher 1 seule fiche, il n'y a pas de problème, par contre, si on en a plusieurs sur la même page, la 1ère fiche est OK et la 2ème pose problème. Le tableau de la 2ème fiche est tronqué et le code HTML s'arrête après la ligne 27  <td width="80%">. Plus rien après...
Les autres fiches ne sont pas affichées.
 
On n'est pas loin de la solution... Mais voilà, où est-ce que cela bloque et pourquoi...
     

Reply

Marsh Posté le 08-06-2006 à 14:36:38    

ahaha
 
je sais
 
Ton code est pas bien structure du tout.
 
 
Tu fais la definition d'une fonction dans une boucle : la premiere fois ca passe. La deuxieme fois, ca doit surrement gueule car PHP ne pige pas pourquoi tu redefini une fonction qui existe deja... (Regarde les sources HTML : je suis sur que tu as une erreur de PHP ! )
 
donc pour organiser tout ca, essaye de separer la presentation (le code HTML) et la partie traitement (PHP), par exemple en mettant les fonctions en debut de fichierm et le HTML a la fin, genre :

Code :
  1. <?php
  2. /**********************
  3. PARTIE TRAITEMENT etc
  4. **********************/
  5. function pouet1($match){
  6.       if (strlen($match[0]) > 60) {
  7.      return '<a href="'.$match[1].'"  target="_blank">'.substr($match[1],0,60).'...'.substr($match[1],-10,10).'</a>';
  8.      }
  9.    else {
  10.     return '<a href="'.$match[1].'" target="_blank">'.$match[1].'</a>';
  11.        }
  12.     }  
  13.      function clicklien($url){  
  14.          $in=array(            '`((?:https?|ftp)://\S+[[:alnum:]]/?)`si',            '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'           );
  15.           $out = 'pouet1';       return preg_replace_callback($in,$out,$url);
  16.         }  
  17.  
  18.  
  19. /******************************
  20. PARTIE PRESENTATION
  21. ********************************/
  22. ?>
  23.    <table width="100%"  border="0" align="center" cellspacing="1">
  24.     <?php
  25.    $i=1;
  26.    foreach ($display as $id) {
  27.    $result=db_query("SELECT * FROM titre WHERE id='".$id."' LIMIT 1" );
  28.    $result=db_fetch_array($result);
  29.    ?>
  30.     <tr>
  31.       <td align="left" colspan="2">
  32.         <table  border="0" cellspacing="3" cellpadding="0" width="80%">
  33.           <tr>
  34.             <td width="20%">Pays :</td>
  35.             <td width="80%"><?=$result['pays'];?></td>
  36.           </tr>
  37.           <tr>
  38.             <td width="20%">Titre :</td>
  39.             <td width="80%"><?=$result['titre'];?></td>
  40.           </tr>
  41.           <tr>
  42.             <td width="20%">Liens :</td>
  43.             <td width="80%">
  44.               <?=nl2br(htmlentities($result['liens']));?>
  45.             </td>
  46.           </tr>
  47.                <tr>
  48.             <td width="20%">Sources web :</td>
  49.             <td width="80%">
  50.              <?php
  51.                  echo clicklien(nl2br(htmlentities($result[''div_liens''])));
  52.    ?>
  53.             </td>
  54.           </tr>
  55.           <tr>
  56.             <td width="20%">Autres sources :</td>
  57.             <td width="80%">
  58.               <?=nl2br(htmlentities($result['autres_sources']));?>
  59.             </td>
  60.           </tr>
  61.           <tr>
  62.             <td width="20%"> </td>
  63.             <td width="80%"> </td>
  64.           </tr>
  65.           <?php if (!empty($result['commentaires'])) { ?>
  66.           <tr>
  67.             <td width="20%">Commentaires :</td>
  68.             <td width="80%">
  69.               <?=nl2br(htmlentities($result['commentaires']));?>
  70.             </td>
  71.           </tr>
  72.           <?php } ?>
  73.         </table>
  74.         <br>
  75.       </td>
  76.     </tr>
  77.     <?php  $i++; }  ?>
  78.    </table>


 
 
NOTE :  
Evite <?=, en effet, sur certain systeme c'est desactive donc utilise <?php echo a la place plutot


Message édité par zapan666 le 08-06-2006 à 14:37:42

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 08-06-2006 à 18:59:09    

Waouuuu super, ça marche. C'est cool. 1000 x MERCI
 
Pour résoudre le problème de <BR>, j'ai mis

Code :
  1. nl2br(clicklien(htmlentities($result[''div_liens''])));


et maintenant c'est OK.
 
Le seul truc qui ne fonctionne pas c'est si on a une URL commençant par www sans le http:// devant.
Il ajoute le lien, mais il n'ajoute pas le http:// devant et le lien ne marche pas, puisqu'il donne un truc du genre : http://www.monsite.com/repertoire/www.monlien.com
 


Message édité par Cindy21 le 08-06-2006 à 20:06:52
Reply

Marsh Posté le 09-06-2006 à 10:26:12    

Uhm c'est plus ou moins normale, mais je sais pas trop comment pouvoir gerer ca.
 
Car tu as deux regex : un pour les www.adresse.com et un autre pour les http://www.adresse.com et dans la fonction pouet, le http:// n'est pas rajoute.
 
Mais le truc c'est que je ne sais pas comment tu peux savoir quand rajouter le http://
 
(au pire tu fais deux appel a preg_replace_callback : la 1er fois avec une regex et la fonction pouet1 la seconde fois avec l'autre regex qui intercepte les www.adresse.com et qui rajoute les www en utilisant une autre fonction de callback comme pouet2 par exemple)


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 09-06-2006 à 14:28:17    

Bon, cette partie est moins importante. J'indiquerai qu'il faut mettre le http:// avant.
 
MERCI encore 1000x pour ta très précieuse aide.
 
Sans toi j'aurai encore mis du temps à trouver une solution.
 
A bientôt !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed