Ajouter automatiquement une cible vide aux liens externes

C'est avec un pincement au cœur que je vous livre une fonction qui vous permettra d'ajouter automatiquement une cible vide (« target=_blank ») aux liens externes contenus dans une chaine de caractères.

Depuis que je crée des sites ou des logiciels, j'ai toujours luté pour ne pas ouvrir les liens externes dans de nouvelles fenêtres, parce que je crois fermement qu'il faut laisser le contrôle de l'interface à l'utilisateur. Malheureusement, on crée des sites pour des clients, et ces clients craignent que leurs visiteurs disparaissent dans leur visite, alors voici la bête :

<?php

function handle_external_anchors($html)
{
    return preg_replace_callback('#<a\s+[^>]+>#''handle_external_anchors_callback'$html);
}

function handle_external_anchors_callback($matches)
{
    $str = array_shift($matches);

    preg_match_all('#([a-z]+)\="([^"]+)#'$str$matches0, PREG_SET_ORDER);

    if (empty($matches[1]))
    {
        return $str;
    }

    $attributes = array_combine($matches[1]$matches[2]);

    if (isset($attributes['href']))
    {
        if (preg_match('#^http(s)?://#'$attributes['href']$m))
        {
            $attributes['target'] = '_blank';
        }
    }

    $str = '<a';

    foreach ($attributes as $attribute => $value)
    {
        $str .= ' ' . $attribute . '="' . $value . '"';
    }

    $str .= '>';

    return $str;
}

La fonction handle_external_anchors() cherche les liens dans la chaine de caractère qu'on lui fourni et ajoute target = "_blank" à ceux qui ont une adresse qui commence par « http:// » ou « https:// ».

C'est mal, mais c'est fait.

Laisser un commentaire

7 commentaires

clem
clem

Si on veux rendre compatible en xhtml strict le target, on peux le faire grâce à onclick : onclick="this.target='_blank'"

Olivier
Olivier

Finalement, heureusement que le XHTML est mort :-) Cela dit, j'utilise toujours le DOCTYPE XHTML, mais la version de transition, qui est quand même moins pénible.

Clem
Clem

Pourquoi tu dis « Finalement, heureusement que le XHTML est mort » ?

Olivier
Olivier

C'était une blague (smily face) parce que la purée de tags qui revient avec le HTML5 n'a rien qui m'enchante.

Ce qui me plait avec le XHTML c'est qu'il est bien formé. Par contre recourir à des ruses de sioux (comme la tienne) pour valider son code en strict c'était quand même dur. Ça me rappelle mon enfance quand j'avais découvert que l'attribut « target » n'était pas valide en strict et que je suis vite retourné en transitionnel pour que mes pages soient de nouveau valides.

Dommage pour le XHTML2 cela dit, j'aimais bien l'idée de coller des « href » partout.

Clem
Clem

Y'a toujours le XHTML5, mais qui est juste le mode de compatibilité pour le XML, y'a aucune restriction par rapport au HTML5. Ducoup on est tellement habituer au XHTML qu'on va faire du XHTML5 sans le savoir.

Olivier
Olivier

« XHTML5 » ils en ont de drôles de noms… C'est vrai qu'on est drôlement habitué et ça me viendrait pas à l'idée d'écrire <input type=text value='madonna'> – l'horreur !

Clem
Clem

Je suis d'accord, pourtant c'est bien valide HTML4/5, on va toujours pourvoir faire du code tout « moche » :-(