Transformer les liens texte en liens hypertexte

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

updated on 6 October 2004

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

    Reply to this 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 ?

    Reply to this 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

    Reply to this message

  • Pierre Troll

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

    Reply to this 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.

    Reply to this 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+.

    Reply to this 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

    Reply to this 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

    Reply to this 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?

    Reply to this 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.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom