Regex pour transformer les URL en lien cliquable

WRInaute impliqué
Bonjour,

tout est dans le titre,

j'ai pour l'instant un:
Code:
$message= preg_replace('!http://[a-z0-9._/-]+!i', '<a href="$0" target="_blank" rel="nofollow">$0</a>', $message);


Ca fonctionne sauf pour les URLS qui contiennent des %20.

J'ai cherché sur mon super pote gg mais tout ce que je trouve emploie des eregi_replace qui est maintenant déconseillé.

QQun aurait ça sous la main ?

Merci
 
WRInaute impliqué
J'up avec du nouveau,

donc maintenant j'ai trouvé et compris ceci (ca réduit aussi les URL)
Code:
$callback_function = create_function( 
                        '$matches', 
                        '$link_displayed = (strlen($matches[0]) > 25) ? substr( $matches[0], 0, 40).\'[&hellip;]\'.substr($matches[0], -10) : $matches[0]; 
                         return \'<a href="\'.$matches[0].\'" title="\'.$matches[0].\'" target="_blank" rel="nofollow">\'.$link_displayed.\'</a>\';' 
                        ); 
            $message = preg_replace_callback($pattern, $callback_function, $message);

Mais la même, en local, ca fonctionne impec.
Online, ca me termine toutes mes urls / >.
Exemple: https://www.google.fr
/>

kesako ?

C'est incompatible ces deux fonctions?
 
WRInaute discret
Pourquoi est-ce que le premier code ne marche pas?
Question bête, tu as bien essayé d'ajouté % dans la regex?
 
WRInaute impliqué
Salut,

je reprends en détaillant un max du début (oubliez mes premiers posts) pour être le plus clair possible

Donc ma page de traitement:
Code:
$message = stripslashes(nl2br($donnees2['message'])); // je récup la données.

// je rends les url cliquable:
 $pattern = '`((?:https?|ftp)://\S+?)(?=[[:punct:]]?(?:\s|\Z)|\Z)`';
         $callback_function = create_function( 
                        '$matches', 
                        '$link_displayed = (strlen($matches[0]) > 25) ? substr( $matches[0], 0, 40).\'[&hellip;]\'.substr($matches[0], -10) : $matches[0]; 
                         return \'<a href="\'.$matches[0].\'" title="\'.$matches[0].\'" target="_blank" rel="nofollow">\'.$link_displayed.\'</a>\';' 
                        ); 
         $message = preg_replace_callback($pattern, $callback_function, $message);

Soit
$message1='http://www.example.com';
$message2='ceci est un exemple http://www.example.com, et ça une url';
Le problème:
Si je laisse le code tel quel, quand je fais echo de $message2, ca donne:
ceci est un exemple http://www.example.com, et ça une url /> (notez le /> en fin de phrase).

Sur $message1 je n'ai pas ce />

J'ai trouvé le coupable. Si j'enlève la fonction nl2br à $message, je n'ai plus de />. Mais, le saut de ligne ne s'effectue plus.
 
WRInaute impliqué
C'est bon, j'ai réglé le problème. Il venait bien du nl2br.

Dans le futur, si y'en a qui ont le même soucis. Il suffit de supprimer le nl2br et de prendre une fonction.
J'ai utilisé
Code:
function mynl2br($text) { 
   return strtr($text, array("\r\n" => '<br />', "\r" => '<br />', "\n" => '<br />')); 
}

Que l'on retrouve ici
http://php.net/manual/fr/function.nl2br.php
 
Discussions similaires
Haut