FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [php] couper une url pour affichage
 

[php] couper une url pour affichage

Il y a 443 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [php] couper une url pour affichage
 
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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 ;)

Code :
  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.             //on se protège du risque d'exécution de code html
  11.             $message = htmlentities ($_POST['message'], ENT_QUOTES);
  12.             $pseudo = $_COOKIE['lchampier_pseudo'];
  13.             $adresseWeb = htmlentities ($_POST['adresseWeb']);
  14.             //on permet le retour à la ligne
  15.             $message = nl2br($message);
  16.             //on paramètre l'affichage des adresses web directement via un regex
  17.             $message = preg_replace('!http://[a-z0-9%&=\?;./_-]+!i', '<a href="$0">$0</a>', $message);
  18.             //on évite les doublons lors du rafraichissement de la page
  19.             $test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message' AND adresseWeb='$adresseWeb'" );
  20.             $count_doublon = mysql_num_rows($test_doublon);
  21.             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
  22.             {
  23.                 //enregistrer les valeurs des variables
  24.                 mysql_query("INSERT INTO minichat (id, pseudo, message, heure, adresseWeb) VALUES('', '$pseudo', '$message', NOW(), '$adresseWeb')" );
  25.                 //on se déconnecte de la BDD
  26.                 mysql_close();
  27.             }
  28.         }
  29.     }
  30. ?>



Merci de votre aide :)


Message édité par marsien le 29-01-2006 à 18:43:20

Profil : Pointeur
Plus d'informations

oui, avec une methode callback qui va vérifier la longueur de la chaine...

Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

OK, merci, je vais donc persévérer dans cette voie, car pour le moment je n'obtiens que des messages d'erreur :D

Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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 :)

Code :
  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.             //on se protège du risque d'exécution de code html
  11.             $message = htmlentities ($_POST['message'], ENT_QUOTES);
  12.             //on récupère le pseudo dans le cookie lchampier_pseudo
  13.             $pseudo = $_COOKIE['lchampier_pseudo'];
  14.             //on permet le retour à la ligne
  15.             $message = nl2br($message);
  16.             //on gère l'activation auto des liens et des images
  17.             function url($selection) //fonction callback
  18.             {
  19.                 if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $selection[0])) //tri des images
  20.                 {
  21.                     $sortie = '<div id="image"><a target="blank" href="'.$selection[0].'"><img src="'.$selection[0].'" width="300px" height="200px"></a></div>';
  22.                 }
  23.                 else
  24.                 {
  25.                     if (strlen($selection[0]) > 30) //coupe l'affichage des longues url
  26.                     {
  27.                         $adresseWebAffichee = substr($selection[0], 0, 30);
  28.                         $adresseWebAffichee = $adresseWebAffichee."...";
  29.                     }
  30.                     else
  31.                     {
  32.                     $adresseWebAffichee = $selection[0];
  33.                     }
  34.                 $sortie = '<div id="lien"><a target="blank" href="'.$selection[0].'">'.$adresseWebAffichee.'</a></div>';
  35.                 }
  36.                 return $sortie;
  37.             }
  38.             $message = preg_replace_callback('!(https?|ftp)://[a-z0-9#%&=\?;._/-]+!i', 'url', $message);
  39.             //on évite les doublons lors du rafraichissement de la page
  40.             $test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message'" );
  41.             $count_doublon = mysql_num_rows($test_doublon);
  42.             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
  43.             {
  44.                 //enregistrer les valeurs des variables
  45.                 mysql_query("INSERT INTO minichat (id, pseudo, message, heure) VALUES('', '$pseudo', '$message', NOW())" );
  46.                 //on se déconnecte de la BDD
  47.                 mysql_close();
  48.             }
  49.         }
  50.     }
  51. ?>

Profil : Pointeur
Plus d'informations

euh ... pourquoi ne pas mettre une contrainte d'unicité sur la colonne message au lieu de faire la requete a la main ??


Message édité par KangOl le 29-01-2006 à 23:32:48
Inside my own Second Life

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:


Message édité par Johan_et_P irlouit le 30-01-2006 à 05:40:00

---------------
Retrouvez moi sur mon blog : http://www.nicolasullern.net/leblog/
Et aussi sur :
http://www.linkedin.com/in/nicolasullern
http://www.viadeo.com/fr/profile/nicolas.ullern
http://www.copaing.net/johanpirlouit/
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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]

Inside my own Second Life

Shino-Genin a écrit :

- 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:


---------------
Retrouvez moi sur mon blog : http://www.nicolasullern.net/leblog/
Et aussi sur :
http://www.linkedin.com/in/nicolasullern
http://www.viadeo.com/fr/profile/nicolas.ullern
http://www.copaing.net/johanpirlouit/
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [php] couper une url pour affichage
 

Annonces Google
Publicité