Transformer les liens texte en liens hypertexte

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

NB : cette fonctionnalité est ajoutée automatiquement par SPIP depuis plusieurs années.
Tous les forumeurs d’un site ne sont pas des SPIPeurs ou ne connaissent pas les balises HTML. Alors, lorsqu’ils saisissent une URL celle-ci apparaît simplement sous forme de texte. Le filtre NORM_LIENS permet de rendre ces liens fonctionnels pour les visiteurs du site.

Ainsi, par exemple ce texte http://www.spip.net sera transforme en un lien cliquable comme ceci : http://www.spip.net

Le filtre s’utilise avec toutes les balises contenant du texte de spip, mais prouveras son utilité surtout dans les boucles gérant les forums.

La syntaxe dans les squelettes doit être du type :
-  [(#TEXTE|norm_liens)]
-  [(#TEXTE|norm_liens{tag}]
tag doit avoir comme valeur blank, self, parent ou top.
Si aucun tag n’est spécifié la balise HREF qui normalisera le lien orphelin n’aura pas de target.

Texte à ajouter dans le fichiers « mes_fonction.php3 » :

/* Filtre NORM_LIENS v2.0 - 29 juillet 2003 - Par Led

   Permet de normaliser les liens lorsque ceux-ci sont orphelins (sans balise
   HREF). Par exemple:
   "http://www.url.com" deviendra "<a href="http://www.url.com">http://www.url.com</a>"

   Le filtre s'utilise avec les balises #CHAPO, #TEXTE, #PS, #NOTES,
   #INTRODUCTION, #DESCRIPTIF et #BIO.

   SYNTAXE DANS LES SQUELETTES:
   [(#TEXTE|norm_liens)]
   [(#TEXTE|norm_liens{tag}]
   Où tag doit avoir comme valeur blank, self, parent ou top.
   Si aucun tag n'est spécifié la balise HREF n'aura pas de target.

   ATTENTION: Si vous désirez utiliser ce filtre avec le filtre CIBLES_LIENS (du
              21 juillet 2003 et écrit par moi-même) sur une même balise SPIP il
              faut obligatoirement placer le filtre NORM_LIENS en premier.
              Exemples: [(#TEXTE|norm_liens|cibles_liens)]
                        [(#TEXTE|norm_liens{tag}|cibles_liens)]
*/

function norm_liens($texte, $target='') {

    $target = '_'.$target;
    if ( $target != "_" ) {
        $texte = eregi_replace(' http://([^ <]*)', ' <a href="http://\\1" target="'.$target.'">http://\\1</a>', $texte);
        $texte = eregi_replace(' ftp://([^ <]*)', ' <a href="ftp://\\1" target="'.$target.'">ftp://\\1</a>', $texte);
        $texte = eregi_replace(' www.([^ <]*)', ' <a href="http://www.\\1" target="'.$target.'">www.\\1</a>', $texte);
        $texte = eregi_replace(' ftp.([^ <]*)', ' <a href="ftp://ftp.\\1" target="'.$target.'">ftp.\\1</a>', $texte);
        $texte = eregi_replace('^http://([^ <]*)', '<a href="http://\\1" target="'.$target.'">http://\\1</a>', $texte);
        $texte = eregi_replace('^ftp://([^ <]*)', '<a href="ftp://\\1" target="'.$target.'">ftp://\\1</a>', $texte);
        $texte = eregi_replace('^www.([^ <]*)', '<a href="http://www.\\1" target="'.$target.'">www.\\1</a>', $texte);
        $texte = eregi_replace('^ftp.([^ <]*)', '<a href="ftp://ftp.\\1" target="'.$target.'">ftp.\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">http://([^ <]*)', '<p class="spip"><a href="http://\\1" target="'.$target.'">http://\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">ftp://([^ <]*)', '<p class="spip"><a href="ftp://\\1" target="'.$target.'">ftp://\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">www.([^ <]*)', '<p class="spip"><a href="http://www.\\1" target="'.$target.'">www.\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">ftp.([^ <]*)', '<p class="spip"><a href="ftp://ftp.\\1" target="'.$target.'">ftp.\\1</a>', $texte);
        }
    else {
        $texte = eregi_replace(' http://([^ <]*)', ' <a href="http://\\1">http://\\1</a>', $texte);
        $texte = eregi_replace(' ftp://([^ <]*)', ' <a href="ftp://\\1">ftp://\\1</a>', $texte);
        $texte = eregi_replace(' www.([^ <]*)', ' <a href="http://www.\\1">www.\\1</a>', $texte);
        $texte = eregi_replace(' ftp.([^ <]*)', ' <a href="ftp://ftp.\\1">ftp.\\1</a>', $texte);
        $texte = eregi_replace('^http://([^ <]*)', '<a href="http://\\1">http://\\1</a>', $texte);
        $texte = eregi_replace('^ftp://([^ <]*)', '<a href="ftp://\\1">ftp://\\1</a>', $texte);
        $texte = eregi_replace('^www.([^ <]*)', '<a href="http://www.\\1">www.\\1</a>', $texte);
        $texte = eregi_replace('^ftp.([^ <]*)', '<a href="ftp://ftp.\\1">ftp.\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">http://([^ <]*)', '<p class="spip"><a href="http://\\1">http://\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">ftp://([^ <]*)', '<p class="spip"><a href="ftp://\\1">ftp://\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">www.([^ <]*)', '<p class="spip"><a href="http://www.\\1">www.\\1</a>', $texte);
        $texte = eregi_replace('<p class="spip">ftp.([^ <]*)', '<a href="ftp://ftp.\\1">ftp.\\1</a>', $texte);
        }
    $texte = eregi_replace('([^ >]*)@([^ ,:!?&<]*)', ' <a href="mailto:\\1@\\2">\\1@\\2</a>', $texte);

    return $texte;
}

Discussion

10 discussions

  • Voici une version actualisée de la fonction qui utilise preg_replace à la place de reregi_replace.

    Par ailleurs, la prise en compte des liens entre parenthèses (http://exemple.net) a été jouée.

    function norm_liens($texte, $target='') {
    
        $target = '_'.$target;
        if ( $target != "_" ) {
            $texte = preg_replace('@ http://([^ <]*)@i', ' <a href="http://$1" target="'.$target.'">http://$1</a>', $texte);
            $texte = preg_replace('@ ftp://([^ <]*)@i', ' <a href="ftp://$1" target="'.$target.'">ftp://$1</a>', $texte);
            $texte = preg_replace('@ www.([^ <]*)@i', ' <a href="http://www.$1" target="'.$target.'">www.$1</a>', $texte);
            $texte = preg_replace('@ ftp.([^ <]*)@i', ' <a href="ftp://ftp.$1" target="'.$target.'">ftp.$1</a>', $texte);
            $texte = preg_replace('@\(http://([^ <]*)\)@i', ' (<a href="http://$1" target="'.$target.'">http://$1</a>)', $texte);
            $texte = preg_replace('@\(ftp://([^ <]*)\)@i', ' (<a href="ftp://$1" target="'.$target.'">ftp://$1</a>)', $texte);
            $texte = preg_replace('@\(www.([^ <]*)\)@i', ' (<a href="http://www.$1" target="'.$target.'">www.$1</a>)', $texte);
            $texte = preg_replace('@\(ftp.([^ <]*)\)@i', ' (<a href="ftp://ftp.$1" target="'.$target.'">ftp.$1</a>)', $texte);
            $texte = preg_replace('@^http://([^ <]*)@i', '<a href="http://$1" target="'.$target.'">http://$1</a>', $texte);
            $texte = preg_replace('@^ftp://([^ <]*)@i', '<a href="ftp://$1" target="'.$target.'">ftp://$1</a>', $texte);
            $texte = preg_replace('@^www.([^ <]*)@i', '<a href="http://www.$1" target="'.$target.'">www.$1</a>', $texte);
            $texte = preg_replace('@^ftp.([^ <]*)@i', '<a href="ftp://ftp.$1" target="'.$target.'">ftp.$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">http://([^ <]*)@i', '<p class="spip"><a href="http://$1" target="'.$target.'">http://$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">ftp://([^ <]*)@i', '<p class="spip"><a href="ftp://$1" target="'.$target.'">ftp://$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">www.([^ <]*)@i', '<p class="spip"><a href="http://www.$1" target="'.$target.'">www.$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">ftp.([^ <]*)@i', '<p class="spip"><a href="ftp://ftp.$1" target="'.$target.'">ftp.$1</a>', $texte);
            }
        else {
            $texte = preg_replace('@ http://([^ <]*)@i', ' <a href="http://$1">http://$1</a>', $texte);
            $texte = preg_replace('@ ftp://([^ <]*)@i', ' <a href="ftp://$1">ftp://$1</a>', $texte);
            $texte = preg_replace('@ www.([^ <]*)@i', ' <a href="http://www.$1">www.$1</a>', $texte);
            $texte = preg_replace('@ ftp.([^ <]*)@i', ' <a href="ftp://ftp.$1">ftp.$1</a>', $texte);
            $texte = preg_replace('@\(http://([^ <]*)\)@i', ' (<a href="http://$1">http://$1</a>)', $texte);
            $texte = preg_replace('@\(ftp://([^ <]*)\)@i', ' (<a href="ftp://$1">ftp://$1</a>)', $texte);
            $texte = preg_replace('@\(www.([^ <]*)\)@i', ' (<a href="http://www.$1">www.$1</a>)', $texte);
            $texte = preg_replace('@\(ftp.([^ <]*)\)@i', ' (<a href="ftp://ftp.$1">ftp.$1</a>)', $texte);
            $texte = preg_replace('@^http://([^ <]*)@i', '<a href="http://$1">http://$1</a>', $texte);
            $texte = preg_replace('@^ftp://([^ <]*)@i', '<a href="ftp://$1">ftp://$1</a>', $texte);
            $texte = preg_replace('@^www.([^ <]*)@i', '<a href="http://www.$1">www.$1</a>', $texte);
            $texte = preg_replace('@^ftp.([^ <]*)@i', '<a href="ftp://ftp.$1">ftp.$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">http://([^ <]*)@i', '<p class="spip"><a href="http://$1">http://$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">ftp://([^ <]*)@i', '<p class="spip"><a href="ftp://$1">ftp://$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">www.([^ <]*)@i', '<p class="spip"><a href="http://www.$1">www.$1</a>', $texte);
            $texte = preg_replace('@<p class="spip">ftp.([^ <]*)@i', '<a href="ftp://ftp.$1">ftp.$1</a>', $texte);
            }
        $texte = preg_replace('#([^ >]*)@([^ ,:!?&<]*)#i', ' <a href="mailto:$1@$2">$1@$2</a>', $texte);
    
        return $texte;
    }

    Répondre à ce message

  • 1

    je suis pas en avance mais j’essaie de faire ca sur une version 1.9 et cela ne marche pas

    j’ai mes liens dans mes articles en version texte mais ils ne se changent pas en html

    est ce du a fichier mes_fonctions.php3 ?

    Répondre à ce message

  • Ce code semble un peu lourd. Cette idée de transformer les liens texte en liens hypertexte a été concrétisée dans le plugin [archive] Tweak SPIP

    Répondre à ce message

  • Pierre Troll

    un problème avec les url contenant des ?
    un espace est généré rendant la fonction inopérante pour spip

    Répondre à ce message

  • 1
    asso.bachant

    trés bon, voir même excellent, attention point trop n’en faut.

    dommage que spipcontrib ne l’utilise pas !

    http:\www.bachant.net

    • Mobcustom

      Oui c’est une très bonne contrib, très utile.

    Répondre à ce message

  • Jean-Marie

    Filtre sympatique mais qui ne fonctionne pas correctement lorsque le lien se situe dans une note. cf résultat depuis le lien. A+.

    Répondre à ce message

  • 5

    Me trompes-je ou c’est cette fonctionnalité qui est intégrée par défaut dans le futur SPIP1.7 ? (case à cocher dans la config de SPIP)

    • Je ne sais pas. J’ai téléchargé la beta, j’irai voir...

    • Je n’ai rien vu à ce sujet dans la v1.7. Tu as vu ça où ?

    • C’est une option que j’ai vu dans la partie administration de SPIP 1.7b3 et qui s’appelle « liens hypertextes ».

      Je ne sais pas ce que signifie cette option (case à cocher) mais cela ressemble bigrement à cet article.

    • Autant pour moi, après vérification il s’agit d’une option qui permet de rajouter une ligne lors de la saisie des articles pour ajouter un lien internet un peu comme ce qui existe déjà dans les brèves et les forums.

    • pas autant pour moi, aux temps pour moi .. ou à la rigueur aux tempes pour moi

    Répondre à ce message

  • 4

    attention, il y a quelques problèmes avec la ponctuation
    par exemple si l’adresse est suivie d’une virgule ou d’un point, cette virgule se trouve intégrée dans l’URL et provoque donc une erreur.

    Autre problème : il y a un conflit avec la façon dont spip gère la typographie, ainsi une url avec articles.php ?id_article=100 verra un espace s’intercaler avant le ?, et là encore l’url ne marche plus.

    Exemple de test :

    http://www.bellaciao.org

    http://paris.indymedia.org/articles.php3?id_article=10000

    quand au site http://www.bellaciao.org, il ne faut pas se méprendre
    voir au contraire <http://paris.indymedia.org/articles...> avec plus de renseignements, ou alors http://paris.indymedia.org/articles.php3?id_article=10000.

    • milles excuses : pour l’exemple, voilà le texte original.
      les url doivent donc être séparées par des blancs. nb : une url entre parenthèses ne marche pas (pas clickable).
      la duxième url bellaciao ne marche pas (à cause de la virgule, de même pour la dernière adress indymedia, polluée par le point final de la phrase). Une adresse email marche (c’est chouette).

      http://www.bellaciao.org
      http://paris.indymedia.org/articles.php3?id_article=10000
      quand au site http://www.bellaciao.org, il ne faut pas se méprendre voir au contraire (http://paris.indymedia.org/articles.php3?id_article=10000) avec plus de renseignements, ou alors http://paris.indymedia.org/articles.php3?id_article=10000.
      [et voir ça->http://www.bellaciao.org]
      mon email : jeppe@no-log.org

    • autre point : les url complexes comme celle du monde avec des virgules donnet des résultats très bizarre. Essayez celle là :

      http://www.lemonde.fr/web/article/0,1-0@2-3218,36-343395,0.html

    • Quelle idée aussi de mettre des virgules dans les URLs ! ;-)

      Nan, sérieusement, je me pencherais sur les problèmes que tu cites lorsque j’aurai un peu de temps de moi...

    • >quand au site http://www.bellaciao.org, il ne faut pas se >méprendre voir au contraire avec plus de renseignements, >ou alors http://paris.indymedia.org/articles.php3 ?>id_article=10000.

      je comprends pas ta phrase...

      « quand au site http://www.bellaciao.org, il ne faut pas se >méprendre voir au contraire »

       :))

      Tip

    Répondre à ce message

  • Bonjour,

    je cherche à créer des liens externes à partir de la boucle DOCUMENTS. Le filtre « liens_ouvrants » n’a pas l’air de s’y appliquer. Et « norm_liens » non plus. Comment faire ?

    Répondre à ce message

  • 1

    Excellent !

    Et c’est compatible, si dans le reste du texte on y un lien du type :

    [Lien->www.lien.com]

     ?

    Yiannis

    • Et c’est compatible, si dans le reste du texte on y un lien du type :

      Oui.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom