Se connecter avec
S'enregistrer | Connectez-vous

[php] couper une url pour affichage

Dernière réponse : dans Programmation
Expert Programmation

Bonsoir,

J'ai mis en place un petit chat en php pour papoter avec mes amis. Et ça marche plutôt bien :) 

C'était aussi mon premier vrai exercice (défi !) pour m'initier au php. Et en conséquence, j'essaie de l'améliorer au fur et à mesure de mes progrès.

Mais je bloque depuis plusieurs heures sur un problème : à l'aide d'une regex (preg_replace) j'ai voulu automatiser la reconnaissance d'url dans un texte (tapé dans un textarea) et évidemment la rendre cliquable. Jusque là tout va encore bien... sauf pour les url longues. J'aimerais bien les couper au niveau de l'affichage, comme c'est le cas sur le forum (par ex : www.blabla[...]bla.html). Je ne sais pas comment faire... Avec un preg_replace_callback ? Si oui, comment l'utiliser dans ce cas précis ?

Ci-dessous le bout de code correcpondant, avec l'objet du délit à la ligne 20 ;) 

  1. <?php
  2. //enregistrer les nouvelles données dans la BDD avant de les afficher en vérifiant l'existence des variables et en se protégeant
  3. if (isset($_POST['message']) OR isset($_POST['adresseWeb'])) //vérifie que les avraibles existent
  4. {
  5. if ($_POST['message'] != NULL OR $_POST['adresseWeb'] != NULL) //vérifie que les variables ne sont pas nulles
  6. {
  7. //on peut se connecter à la base
  8. mysql_connect("sql.free.fr", "********", "********"); //serveur (en local, localhost), login(en local, root), password (en local, rien)
  9. mysql_select_db("lchampier"); //choix de la base
  10.  
  11. //on se protège du risque d'exécution de code html
  12. $message = htmlentities ($_POST['message'], ENT_QUOTES);
  13. $pseudo = $_COOKIE['lchampier_pseudo'];
  14. $adresseWeb = htmlentities ($_POST['adresseWeb']);
  15.  
  16. //on permet le retour à la ligne
  17. $message = nl2br($message);
  18.  
  19. //on paramètre l'affichage des adresses web directement via un regex
  20. $message = preg_replace('!http://[a-z0-9%&=\?;./_-]+!i', '<a href="$0">$0</a>', $message);
  21.  
  22. //on évite les doublons lors du rafraichissement de la page
  23. $test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message' AND adresseWeb='$adresseWeb'");
  24. $count_doublon = mysql_num_rows($test_doublon);
  25. if ($count_doublon == 0) //si le même message du même pseudo n'est pas déjà présent dans la BDD, on l'enregistre
  26. {
  27. //enregistrer les valeurs des variables
  28. mysql_query("INSERT INTO minichat (id, pseudo, message, heure, adresseWeb) VALUES('', '$pseudo', '$message', NOW(), '$adresseWeb')");
  29. //on se déconnecte de la BDD
  30. mysql_close();
  31. }
  32. }
  33. }
  34. ?>


Merci de votre aide :) 

Autres pages sur : php couper url affichage

Lassé par la pub ? Créez un compte
Expert Programmation

Vous trouverez ci-dessous ma propre solution (qui vaut ce qu'elle vaut...) en réponse à ma question initiale : couper les url trop longues. J'en ai profité pour y ajouter un tri des liens pointants vers une image, histoire de l'afficher directement :) 

  1. <?php
  2. //enregistrer les nouvelles données dans la BDD avant de les afficher, tout en vérifiant l'existence des variables et en se protégeant
  3. if (isset($_POST['message']) OR isset($_POST['adresseWeb'])) //vérifie que les variables existent
  4. {
  5. if ($_POST['message'] != NULL OR $_POST['adresseWeb'] != NULL) //vérifie que les variables ne sont pas nulles
  6. {
  7. //on peut se connecter à la base
  8. mysql_connect("localhost", "root", ""); //serveur (en local, localhost), login(en local, root), password (en local, rien)
  9. mysql_select_db("test"); //choix de la base
  10.  
  11. //on se protège du risque d'exécution de code html
  12. $message = htmlentities ($_POST['message'], ENT_QUOTES);
  13.  
  14. //on récupère le pseudo dans le cookie lchampier_pseudo
  15. $pseudo = $_COOKIE['lchampier_pseudo'];
  16.  
  17. //on permet le retour à la ligne
  18. $message = nl2br($message);
  19.  
  20. //on gère l'activation auto des liens et des images
  21. function url($selection) //fonction callback
  22. {
  23. if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $selection[0])) //tri des images
  24. {
  25. $sortie = '<div id="image"><a target="blank" href="'.$selection[0].'"><img src="'.$selection[0].'" width="300px" height="200px"></a></div>';
  26. }
  27. else
  28. {
  29. if (strlen($selection[0]) > 30) //coupe l'affichage des longues url
  30. {
  31. $adresseWebAffichee = substr($selection[0], 0, 30);
  32. $adresseWebAffichee = $adresseWebAffichee."...";
  33. }
  34. else
  35. {
  36. $adresseWebAffichee = $selection[0];
  37. }
  38. $sortie = '<div id="lien"><a target="blank" href="'.$selection[0].'">'.$adresseWebAffichee.'</a></div>';
  39. }
  40. return $sortie;
  41. }
  42. $message = preg_replace_callback('!(https?|ftp)://[a-z0-9#%&=\?;._/-]+!i', 'url', $message);
  43.  
  44. //on évite les doublons lors du rafraichissement de la page
  45. $test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message'");
  46. $count_doublon = mysql_num_rows($test_doublon);
  47. if ($count_doublon == 0) //si le même message ou le même lien n'est pas déjà présent dans la BDD, on l'enregistre
  48. {
  49. //enregistrer les valeurs des variables
  50. mysql_query("INSERT INTO minichat (id, pseudo, message, heure) VALUES('', '$pseudo', '$message', NOW())");
  51. //on se déconnecte de la BDD
  52. mysql_close();
  53. }
  54. }
  55. }
  56. ?>

Autre question : pourquoi verrouiller les dimensions de l'image à 300x200 ? Pourquoi ne pas les "laisser vivre" (les attributs de dimension peuvent être facultatifs, le moteur de rendu prenant comme dimensions celles de l'image effectivement affichée à l'avant-plan), jusqu'à des dimensions max, largeur et/ou hauteur, puisque PHP retrouve facilement les attributs de fichier d'image (dimensions, type/format, ..), au moins avec la fonction getimagesize ?

Autre chose : target="blank" s'écrit target="_blank" et 'target' n'est plus un attribut reconnu pour le cas de l'XHTML 1.0 Strict et 1.1.. Si tu veux faire un lien externe vers une nouvelle fenêtre, utilises un script JS adapté, genre celui trouvé sur http://tim.bellette.net/?cat=6 (c'est le premier que j'ai retrouvé sur Google, flemme d'allumer mon second PC juste pour retrouver le lien d'un autre avec un descriptif plus complet et plus précis des pourquoi et des comment), qui utilise l'attribut 'rel' : rel="external".. Dans les quelques cas où JS n'est pas activé ou exploité par le navigateur, le site n'est pas dégradé pour autant..

:jap: 
Expert Programmation

Merci pour vous remarques. :) 

Je vais commencer par la fin !
- le target="_blank", je ne l'utilise pas, d'où mon erreur dans l'écriture même de la commande :p  Je l'ai juste mis pour moi, afin de faire un test avant d'insérer le javascript (que tu m'avais déjà indiqué par ailleurs J&P, et je t'en remercie :jap:  ).
- pour les images, le 300 x 200 n'était-là que temporairement aussi. En fait, je ne veux pas que sur la page s'affiche des images trop grandes, pour des raisons de design... Je pensais ensuite gérer tout ça par une commande css, limitant la largeur. Les images ne seront pas sur le serveur, mais en provenance de liens externes. Je vais donc me pencher sur getimagesize pour voir ce que je peux faire avec :) 
- enfin, pourquoi je ne mets pas une contrainte d'unicité sur la colonne message. Tout simplement parce que je ne savais pas que c'était possible ! Et la méthode que j'ai utilisée, c'est celle décrite dans le site du Zéro... Je vais aussi me pencher sur ça, ne serait-ce que pour alléger mon code ;) 

Encore merci pour toutes ces remarques constructives.

J'aurais juste une dernière question : comment automatiser le rafraichissement de la page toutes les x secondes (ou minutes ou heures...), sans perdre (et perturber) le texte en cours de frappe ? Pour le moment j'utilise le metatag refresh, mais il semble poser problème à quelques utilisateurs... Existe-t-il quelque chose de mieux ? Je n'ai rien trouvé à ce propos sur Google... peut-être n'ai-je pas su chercher avec les bons mots [:amphipolis:1]

Shino-Genin a dit :
- le target="_blank", je ne l'utilise pas, d'où mon erreur dans l'écriture même de la commande :p  Je l'ai juste mis pour moi, afin de faire un test avant d'insérer le javascript

Désolé, j'aurais dû m'en douter :ange: ....... Mais il y a des jours où mes neurones dorment un peu plus que d'hab' :D ..

:jap: 
Expert Programmation

C'est pas grave, il est toujours bon de rappeler les bons reflex ;) 

Et concernant ma dernière question sur le refresh, j'ai trouvé une solution en séparant rédaction et affichage des messages :) 

Encore merci de votre aide
Lassé par la pub ? Créez un compte