IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Convertir des URL d'une variable en liens cliquables


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut Convertir des URL d'une variable en liens cliquables
    Bonjour Développez.com

    Sur ce forum, lorsqu'on entre une URL, elle est automatiquement transformée en un lien cliquable: C'est génial.
    Exemple: www.developpez.com

    J'aimerais faire la même chose sur mon site. Pourriez-me dire comment vous faites?
    Est-ce que vous faites cette transformation automatiquement avant sauvegarde dans la base de donnée?
    ou après: Entre la sortie de la base et l'affichage sur écran?

    De mon coté, j'ai un formulaire du type "textarea":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form action="'.$File.'.php" method="post">
        <input type="hidden" name="CrewName" value="'.$CrewName.'" />
        <textarea class="TxtAr" name="MyPost" rows="9" maxlength="1500"></textarea>
        <p><input type="submit" name="SavePost" value="Ok" /></p>
    </form>
    Ensuite, voici mon code php qui sauvegarde le post:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (isset($_POST['SavePost'])) {$Today=date("Y-m-d");
      if (!empty($_POST['MyPost'])) {$CrewName=$_POST['CrewName'];
        $MyPost = filter_var($_POST['MyPost'], FILTER_SANITIZE_STRING);
        $MyBase = new mysqli($BaseHost, $BaseUser, $BasePass, $BaseName);
        $Statement = $MyBase->prepare('INSERT INTO imapost (PostDate, CrewName, MyPost) VALUES (?,?,?)');
        $Statement->bind_param('sss', $Today, $CrewName, $MyPost); $Ok=$Statement->execute();
        if ($Ok) {$PostAct=1;} $MyBase->close();}
      else {$ForgotInfo=1;}}
    Et voici mon code qui affiche les posts:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (isset($_GET['AllPost'])) {$MyBase = new mysqli($BaseHost, $BaseUser, $BasePass, $BaseName);
        $Result = $MyBase->query('SELECT * FROM imapost');
        echo '<h3>Voici tous les posts:</h3>';
        while ($Data = $Result->fetch_array()) {echo $Data['MyPost'].'<br />';}
        $Result->free(); $MyBase->close();}
    Donc, jusque là, tout marche très bien mais évidement si une URL était contenu dans la variable $Data['MyPost'],
    elle n'est pas automatiquement transformée en un lien cliquable puisque je n'ai rien programmé à ce niveau là.
    Et si même, le posteur avait pris la précaution de formuler l'URL accompagnée de la balise "a href",
    ce balisage est supprimé, par sécurité lors de l'opération "SANITIZE" avant sauvegarde dans la base de donnée.

    Maintenant, j'en reviens donc à ma question du début de ce post.
    Comment détecter en php l'URL ou les URL qui seraient présentes dans la variable $Data['MyPost']
    afin de les convertir automatiquement en lien?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    La syntaxe des URLs (comme d'une adresse email d'ailleurs) est extrêmement complexe. S'il est difficile de valider une URL (heureusement qu'il y a des fonctions pour ça), il est encore plus ardu de les détecter au milieu d'un texte. Donc la solution est généralement un compromis:


    Ici, visiblement, le compromis consiste à prendre comme départ soit les schemes http, https, ftp, soit directement un hostname commençant par www, les adresses ip v4 et v6 sont exclues de même que les URLs avec username et password entre double quotes.

    Donc sans trop m'avancer, je pense qu'on peut tabler sur quelque chose comme ça: $txt = preg_replace('~\b(?:(?:https?|ftp)://|www\.)\w\S*(?!\w)~i', '<a href="$0">$0</a>', $txt);.
    De toute manière ça ne sert pas à grand chose de faire plus élaboré, c'est purement cosmétique et ça risque de faire des faux positifs. Le truc c'est de laisser la liberté à l'utilisateur d'écrire une url via des BBCodes ou du Markdown.

  3. #3
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci beaucoup CosmoKnacki pour votre réponse.

    Vous semblez plutôt doué dans les regex. Je découvre seulement aujourd'hui leur existence.
    Autant dire que cela ressemble à du chinois pour moi... Pour le moment... Il faut que je m'y habitue un peu...

    Oui, en effet, cela n'a pas l'air simple de couvrir tous les cas de figure et, en effet, cela risque au final de faire des faux positifs.
    Que pensez-vous d'une petite note à mes utilisateurs leur demandant de mettre leurs liens sur 1 ligne séparée des autres?
    On pourrait dés lors envisager une regex relativement simple et efficace prenant en compte pour début de chaine "http" ou "www"
    et pour fin de chaine un "br /"... Cela vous parait-il idiot?

    Que voulez-vous dire par: "Le truc c'est de laisser la liberté à l'utilisateur d'écrire une url via des BBCodes ou du Markdown."

    J'ai trouvé le code qui suit sur: http://www.michaeljacobsen.ninja/res...rn-into-a-link
    Qu'en pensez-vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
     
    function Url2Link($string){
    $RegexUrl = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
     
    if (preg_match($RegexUrl, $string, $url)) {
    	if (strpos( $url[0], ":" ) === false){$link = 'http://'.$url[0];}
      else {$link = $url[0];}
     
    $string = preg_replace($RegexUrl, '<a href="'.$link.'" title="'.$url[0].'" target="_blank">'.$url[0].'</a>', $string);}
     
    return $string;}
    ?>

  4. #4
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci badaze pour toutes ces infos.
    J'ai besoin d'un peu de temps maintenant pour tout comprendre.
    J'évolue sur un terrain où tout est nouveau pour moi...
    Les regex ainsi que leur usage avec preg_replace()...
    C'est la toute toute première fois que j'entends parler de ça.
    Encore merci pour toutes ces infos.

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    On pourrait dés lors envisager une regex relativement simple et efficace prenant en compte pour début de chaine "http" ou "www"
    et pour fin de chaine un "br /"... Cela vous parait-il idiot?

    Que voulez-vous dire par: "Le truc c'est de laisser la liberté à l'utilisateur d'écrire une url via des BBCodes ou du Markdown."

    Je veux dire qu'un utilisateur voulant qu'une adresse devienne un lien, le signalera lui même en utilisant un de ces formatages (BBcode ou Markdown: faire une recherche).
    Pourquoi inventer un système avec des br / alors qu'il existe des formatages déjà connus des utilisateurs comme le BBCode (les balises utilisées sur ce forum) ou le Markdown (un autre système de formatage utilisé par exemple sur stackoverflow.com)? En plus tu trouveras des modules conçus pour ces systèmes.

    À propos de la pattern que tu as trouvé, ça sent la pattern copiée/collée à 20 km (par celui qui l'a proposé), donc je ne m'y attarderai pas. Personnellement je préfère partir d'une pattern modeste que j'améliore au cours du temps selon mes besoins, plutôt que de partir sur un truc incompréhensible et potentiellement mal fichu. D'ailleurs il vaut mieux que tu partes sur la pattern de badaze qui est plus restrictive, personnellement j'ajouterai un \b au début, le modificateur i et je passerai un des groupes de capture en groupe non-capturant, mais elle est plus à même d'éviter des faux positifs.

    regex101.com est pratique pour faire des tests. Le tutoriel de Guillaume Rossolini est très bien pour les regex en php, de même que le manuel php qui est bien fait sur ce sujet.

  6. #6
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Le tutoriel de Guillaume Rossolini est très bien pour les regex en php, de même que le manuel php qui est bien fait sur ce sujet.
    Ou est ce tuto de Guillaume sur les regex? Pourrais-tu me donner un lien direct?

    Oh pardon, je ne le trouvais pas dans le menu de DVP mais je l'ai trouvé avec un coup de Google:
    https://g-rossolini.developpez.com/tutoriels/php/regex/

  7. #7
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Voici une possibilité.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $texte   = "le site <a href="http://www.emmella.fr" target="_blank">http://www.emmella.fr</a> est un très bon site. <a href="https://www.developpez.net/" target="_blank">https://www.developpez.net/</a> aussi !<br/> Voyez cette page <a href="http://www.emmella.fr/page2192-2079-7670-1770-8497__7683-7833-8473-5217-7777.html" target="_blank">http://www.emmella.fr/page2192-2079-...5217-7777.html</a>";
     
    $pattern = "~((https?|ftp|ssh|mailto):\/\/([a-z0-9\/:%_+.,#?!@&=-]+))~";
    $texte2  = preg_replace($pattern,"<a href='\\1'>\\3</a>",$texte);
     
    print $texte2;

    Nom : Capture20181226_002.JPG
Affichages : 793
Taille : 16,4 Ko

    \\1 correspond à la capture des caractères qui sont entre les parenthèses couleur saumon. le 1 fait référence au groupe qui va de la première parenthèse ouvrante à sa correspondance fermante.
    \\3 correspond à la capture des caractères qui sont entre les parenthèses couleur bleu. le 3 fait référence au groupe de la troisième parenthèse ouvrante à sa correspondance fermante.


    Le code dit "remplace les caractères qui 'matchent' l'expression régulière par <a href=' + tous les caractères appartenant au groupe 1 + '> + tous les caractères appartenant au groupe 3 + </a>".

    Ainsi on a l'url complète dans la propriété href du tag a et sa partie sans http comme partie cliquable.

    Nom : Capture20181226_001.JPG
Affichages : 752
Taille : 24,3 Ko

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par olivierdauxais Voir le message
    ...Sur ce forum, lorsqu'on entre une URL, elle est automatiquement transformée en un lien cliquable: C'est génial.
    Exemple: [url]www.developpez.com[/url]
    1- sur DVP, c'est d'abord converti en BBcode : [url].....[/url]
    C'est ce qui est enregistré en bdd.

    La transformation en lien (<a href="...">) se fait au moment de l'affichage.

    ...De mon coté, j'ai un formulaire du type "textarea"...
    2- pourquoi ne pas installer un éditeur WYSIWYG ?
    Ou un éditeur de BBcode ?

  9. #9
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci Cosmoknacki et Jreaux62 pour vos compléments d'information.

    Lorsque vous parlez de BBCode. Suggérez-vous de procéder au téléchargement des packs du lien ci-dessous?
    http://www.phpbb-fr.com/telechargeme...f3d5e8c29a0188

    Puis ensuite d'intégrer ce pack dans son site? Est-ce que le forum de DVP est fait ainsi?

    Jreaux62, tu dis:
    La transformation en lien (<a href="...">) se fait au moment de l'affichage.
    Merci pour l'info. Quelle fonction php utilises-tu pour cette action?
    Serait-ce possible de voir ce bout de code qui traite la chose?

    En général, j'aime écrire du code et comprendre ainsi très précisément chaque rouage...
    Plutôt que de faire de l'assemblage de pack dont on ne connait pas chaque recoin...
    Je n'utilise aucun CMS comme Wordpress, Joomla... etc...
    J'aime poser moi-même chaque brique de l'édifice...
    Quand bien même cela peut être beaucoup plus long...

  10. #10
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Tu fais le remplacement avec preg_replace en utilisant la technique indiquée dans mon message.
    Attention. Je ne parle pas de l’expression régulière en elle même mais de \\1 ou \\3.

  11. #11
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Oui badaze, je suis en train de voir le code que tu proposes et de comprendre chaque caractère de la regex...

    En repensant au BBCode, cela n'est pas dans l'esprit que je souhaitais.
    En effet, l'usage des BBCode incite l'utilisateur à s'adapter à la machine...
    Alors que je considère depuis toujours que c'est à la machine de s'adapter à l'homme.

    Dés lors, c'est pour ça que j'ai été séduit par le fait que ce forum convertit des URL en lien...
    Même si on n'a pas pris la peine de les baliser.
    Je trouve cela génial et c'est pourquoi, j'aimerai bien voir le code php de DVP qui fait cette chose.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par olivierdauxais Voir le message
    ... c'est pour ça que j'ai été séduit par le fait que ce forum convertit des URL en lien...
    Même si on n'a pas pris la peine de les baliser...
    Si tu regardes les "options supplémentaires" (en dessous du textarea), tu verras une case à cocher :
    • "Convertir automatiquement les liens dans le message
      Transformera www.example.com par [URL]http://www.example.com[/URL]."


    Ce qui laisse LE CHOIX à l'utilisateur.

  13. #13
    Invité
    Invité(e)
    Par défaut
    RE.

    1- Tu devrais lire attentivement ce que te conseille CosmoKnacki.
    Car il est vraiment l'un des meilleurs spécialistes des regex sur DVP.

    2-
    Citation Envoyé par olivierdauxais Voir le message
    En effet, l'usage des BBCode incite l'utilisateur à s'adapter à la machine...
    Alors que je considère depuis toujours que c'est à la machine de s'adapter à l'homme.
    Ce qui ME dérange dans ton approche, c'est que tu vas IMPOSER de transformer automatiquement toutes les URLs présentes dans la chaine.

    OR, avec le système de BBcode :
    • il y a une icône (dans le mini-menu) qui permet à l'utilisateur d'ajouter un lien/URL à un mot/phrase (et à fortiori à une URL)
    • l'utilisateur peut donc CHOISIR de mettre un lien OU PAS
    • (sur DVP, comme je l'ai dit), il y a aussi une case à cocher "Convertir automatiquement les liens dans le message", qui laisse aussi LE CHOIX à l'utilisateur.
    • on peut même CHOISIR de NE PAS transformer ponctuellement une URL (ou autre BBcode) avec [noparse]...[/noparse]

    BREF : c'est AU CHOIX de l'utilisateur.

    N.B. Pour info, il existe des système de BBcode TRES SIMPLES, où on peut définir les icônes disponibles : [B] (gras), [I] (italique),...... sans avoir besoin forcément d'un menu plus "complet".
    Tu devrais télécharger et TESTER les BBcode. *

    * Ne serait-ce que pour ÉTUDIER les fonctions utilisées !


    3- Si je reprends mon exemple précédent :
    JE n'ai pas forcément envie que www.monsite.com soit automatiquement transformé en lien, puisqu'il s'agit d'une URL FICTIVE !
    Du coup, je suis obligé d'écrire : [noparse]www.monsite.com[/noparse].

    4- A ne pas oublier non plus qu'une URL peut se présenter sous cette forme : www.monsite.com?var1=aaa&var2=bbb#top


    Bon courage !
    Dernière modification par Invité ; 29/12/2018 à 16h41.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. insérer des côtes dans une variable pl/sql
    Par illegalsene dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/01/2007, 14h20
  2. Réponses: 1
    Dernier message: 28/09/2006, 16h21
  3. Récupérer des infos par une variable session
    Par nebil dans le forum Langage
    Réponses: 4
    Dernier message: 03/09/2006, 23h02
  4. Comment récupérer le contenu d'une URL dans une variable ?
    Par Fildz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/08/2006, 09h26
  5. [MySQL] Lier une variable à un lien href
    Par mickdu90 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 20/06/2006, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo