[php] couper une url pour affichage
Dernière réponse : dans 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
Merci de votre aide
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
<?php
//enregistrer les nouvelles données dans la BDD avant de les afficher en vérifiant l'existence des variables et en se protégeant
if (isset($_POST['message']) OR isset($_POST['adresseWeb'])) //vérifie que les avraibles existent
{
if ($_POST['message'] != NULL OR $_POST['adresseWeb'] != NULL) //vérifie que les variables ne sont pas nulles
{
//on peut se connecter à la base
mysql_connect("sql.free.fr", "********", "********"); //serveur (en local, localhost), login(en local, root), password (en local, rien)
mysql_select_db("lchampier"); //choix de la base
//on se protège du risque d'exécution de code html
$message = htmlentities ($_POST['message'], ENT_QUOTES);
$pseudo = $_COOKIE['lchampier_pseudo'];
$adresseWeb = htmlentities ($_POST['adresseWeb']);
//on permet le retour à la ligne
$message = nl2br($message);
//on paramètre l'affichage des adresses web directement via un regex
$message = preg_replace('!http://[a-z0-9%&=\?;./_-]+!i', '<a href="$0">$0</a>', $message);
//on évite les doublons lors du rafraichissement de la page
$test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message' AND adresseWeb='$adresseWeb'");
$count_doublon = mysql_num_rows($test_doublon);
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
{
//enregistrer les valeurs des variables
mysql_query("INSERT INTO minichat (id, pseudo, message, heure, adresseWeb) VALUES('', '$pseudo', '$message', NOW(), '$adresseWeb')");
//on se déconnecte de la BDD
mysql_close();
}
}
}
?>
Merci de votre aide
Autres pages sur : php couper url affichage
Lassé par la pub ? Créez un compte
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
<?php
//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
if (isset($_POST['message']) OR isset($_POST['adresseWeb'])) //vérifie que les variables existent
{
if ($_POST['message'] != NULL OR $_POST['adresseWeb'] != NULL) //vérifie que les variables ne sont pas nulles
{
//on peut se connecter à la base
mysql_connect("localhost", "root", ""); //serveur (en local, localhost), login(en local, root), password (en local, rien)
mysql_select_db("test"); //choix de la base
//on se protège du risque d'exécution de code html
$message = htmlentities ($_POST['message'], ENT_QUOTES);
//on récupère le pseudo dans le cookie lchampier_pseudo
$pseudo = $_COOKIE['lchampier_pseudo'];
//on permet le retour à la ligne
$message = nl2br($message);
//on gère l'activation auto des liens et des images
function url($selection) //fonction callback
{
if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $selection[0])) //tri des images
{
$sortie = '<div id="image"><a target="blank" href="'.$selection[0].'"><img src="'.$selection[0].'" width="300px" height="200px"></a></div>';
}
else
{
if (strlen($selection[0]) > 30) //coupe l'affichage des longues url
{
$adresseWebAffichee = substr($selection[0], 0, 30);
$adresseWebAffichee = $adresseWebAffichee."...";
}
else
{
$adresseWebAffichee = $selection[0];
}
$sortie = '<div id="lien"><a target="blank" href="'.$selection[0].'">'.$adresseWebAffichee.'</a></div>';
}
return $sortie;
}
$message = preg_replace_callback('!(https?|ftp)://[a-z0-9#%&=\?;._/-]+!i', 'url', $message);
//on évite les doublons lors du rafraichissement de la page
$test_doublon = mysql_query("SELECT*FROM minichat WHERE message='$message'");
$count_doublon = mysql_num_rows($test_doublon);
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
{
//enregistrer les valeurs des variables
mysql_query("INSERT INTO minichat (id, pseudo, message, heure) VALUES('', '$pseudo', '$message', NOW())");
//on se déconnecte de la BDD
mysql_close();
}
}
}
?>
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..
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..
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
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
).
- 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
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
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
).- 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
Shino-Genin a dit :
- le target="_blank", je ne l'utilise pas, d'où mon erreur dans l'écriture même de la commande
Je l'ai juste mis pour moi, afin de faire un test avant d'insérer le javascriptDésolé, j'aurais dû m'en douter
....... Mais il y a des jours où mes neurones dorment un peu plus que d'hab'
..
Lassé par la pub ? Créez un compte