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 :

faire un lien depuis une URL postée [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Points : 104
    Points
    104
    Par défaut faire un lien depuis une URL postée
    Bonsoir @ tous,

    Je souhaite une fois que j'ai récupérer le contenu d'un post afficher le résultat. Et si dans le contenu, il y a une URL, je souhaite la rendre cliquable.

    jusqu'ici tout va bien et voila ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sHtml = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
    Dans ce cas si l'on envoie http://www.bob.fr, ca le transforme en lien.
    Moi ce que je voulais c'est que cela fasse la meme chose si l'on envoie que www.bob.fr alors j'ai esayer de faire de couplé le code ci-dessus avec un autre ereg_replace : "www[^<>[:space:]]+[[:....." mais evidement ca se mélange les pinceaux.

    Donc si vous aviez une solution à mon problème, ce serait génial...
    Merci

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Bonjour,

    Tu peux rendre, dans ton pattern, le http:// comme étant facultatif et devant apparaître 0 ou 1 fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $sHtml = "http://www.developpez.com";
    echo "Avec http : " . $sHtml . "<br/>";
    $sHtml = ereg_replace("([[:alpha:]]+://)?[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
    echo "Avec http (apres conversion) : " . $sHtml . "<br/>";
    $sHtml = "www.developpez.com";
    echo "Sans http : " . $sHtml . "<br/>";
    $sHtml = ereg_replace("([[:alpha:]]+://)?[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\" class=\"lien\" target=\"_blank\">\\0</a>", $sHtml);
    echo "Sans http (apres conversion) : " . $sHtml . "<br/>";
    ?>
    Par contre ca semble poser un problème, chez moi le lien n'est pas valide s'il n'y a pas http:// devant.
    dans ce cas il faut a mon avis que tu fasses plusieurs cas mais sans les combiner. Tu detectes dans quel cas tu es par un preg_match (http://www ou http:// sans www, ou encore juste www.) et ensuite tu fais ton ereg_replace()

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Points : 104
    Points
    104
    Par défaut
    Je me doutais que ce ne serait pas si simple que ca... Et puis les expressions régulières et moi, ca fait plusieurs !
    Je vais essayer de chercher une solution.

    En tout cas merci.
    Schuss

  4. #4
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Essaye celle la :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('#([a-z]+://)?(www.)?[a-z0-9-_]+\.[a-z]{2,4}(?:[^.]+\.[a-z0-9]+)?#i', '<a href="$0" class="lien" target="_blank">$0</a>', $sHtml);

    Si elle te convient, je pourrais toujours te l'expliquer

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Points : 104
    Points
    104
    Par défaut
    Merci Korco,


    Afin d'y apporter la denière modifcation qui me donnera entière satisfaction : transformer tous les www. en http://www. dans le href pour que tous les liens fonctionnent.
    Je veux bien que tu m'expliques le fonctionnement de cette expression régulière. Voici ce que je pense avoir compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_replace('#([a-z]+://)?(www.)?[a-z0-9-_]+\.[a-z]{2,4}(?:[^.]+\.[a-z0-9]+)?#i', '<a href="$0" class="lien" target="_blank">$0</a>', $sHtml);
    ([a-z]+://)?(www.) pour tout ce que commence par http:// ou www.

    euh et après j'suis largué

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Korko stp ^^

    Tien voila (jlai amélioré)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    preg_replace_callback('#([a-z]+://)?(?:www.)?[a-z0-9-_]+(?:\.[a-z]{2,4})+/?(?:[a-z0-9-_%/]+\.[a-z0-9]+)?(?:\?[^\s]*)?#i', 'make_link', $sHtml);
     
    function make_link($match)
    {
    	return '<a href="'.(empty($match[1])) ? 'http://'.$match[0] : $match[0].'" class="lien" target="_blank">'.$match[0].'</a>';
    }
    Pour l'explication, la voila :
    Tout dabord, les # #i sont juste la pour encadrer l'expression et le i veux dire que si tu met un A au lieu d'un a ça fonctionne aussi.
    Ensuite, les (?: ) c'est pour délimiter une zone (qui permet d'utiliser le ? pour 0 ou 1, le * pour 0 ou plus et le + pour 1 ou plus

    ([a-z]+://)? => n'importe quelle suite de lettre suivies de "://" ce qui inclu http:// ftp:// https:// et j'en passe. C'est optionnel (le ?)
    (www.)? => La chaine "www." optionnelle
    [a-z0-9-_]+ => n'importe quelle suite de lettre, chiffres, tiret et tiret bas
    (\.[a-z]{2,4})+ => Nom de domaine : un point suivi d'une suite de 2 à 4 lettre (de .fr le plus court à .info le plus long), attention en cas de .fr.st par exemple
    [a-z0-9-_%/]+ => une suite quelconque de lettres, de chiffres, de % de tiret, de tiret bas et de slash.
    \.[a-z0-9]+ => l'extension si jamais c'est un fichier a savoir un point suivi d'une suite de lettres ou de chiffres
    \?[^\s]* => les parametres passés au fichier exemple à savoir une suite de caractères jusqua un espace : ?toto=truc&machin=truc

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Points : 104
    Points
    104
    Par défaut
    Oups, désolé "quorquau" pour la fote !
    Bon en vrai,MERCI beaucoup Korko Fain pour les explications, j'y vois plus clair.

    En revanche je comprends pas bien ce que tuveux faire avec preg_replace_callback, tu veux appeler la fonction make_link ? dans ce cas pour le faire comme s'il s'agissait d'un string ?

    Autrement si j'ai bien compris, ta fonction ajoute ta fonction make_link ajoute
    le http:// si il n'est pas renseigné.

  8. #8
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    la fonction preg_replace_callback appel la méthode dite 'callback' à chaque fois que tu trouve une chaine qui correspond à ta regex. La méthode callback est soit le nom de la fonction soit un tableau contenant le nom de la classe et le nom de la méthode.

    La methode callback prend en parametre le tableau de capture et doit retourner la chaine de remplacement.

    Ici ça me permet d'ajouter http:// si il n'y est pas.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/06/2015, 11h38
  2. [FLASH 8] Charger dynamiquement des bmp depuis une url
    Par matN59 dans le forum Intégration
    Réponses: 1
    Dernier message: 24/04/2006, 15h24
  3. Recupération de données XML depuis une URL
    Par tonymo dans le forum Format d'échange (XML, JSON...)
    Réponses: 27
    Dernier message: 21/11/2005, 13h48
  4. Liens depuis une base de donnée statique
    Par LucG dans le forum Access
    Réponses: 4
    Dernier message: 26/10/2005, 11h12
  5. [Excel] Faire des liens internes à une feuille
    Par Invité dans le forum Excel
    Réponses: 1
    Dernier message: 25/08/2005, 12h04

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