8722 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai créé une fonction de reconnaissance automatique de lien, qui marche bien globalement sauf quand une balise est accolée au lien.

Par exemple :
"http://www.google.fr est un moteur de recherche"
devient bien
"<a href="http://www.google.fr" target="_blank">www.google.fr</a> est un moteur de recherche"

mais
"http://www.google.fr<br />est un moteur de recherche"
va faire planter ma page en devenant
"<a href="http://www.google.fr<br /" target="_blank">www.google.fr<br /</a> est un moteur de recherche"

Mon expression régulière ne s'arrête pas au premier "<" (ou autre) rencontré, alors qu'il ne fait pas partie de mon expression autorisée.

Comment résoudre le problème ? Ou comment l'exclure efficacement ?

Voici ma fonction :

function detecte_lien($str){		
return preg_replace('#(https?://)([\w\d.&:\#@%/;$~_?\+-=]*)#','<a href="$1$2" target="_blank">$2</a>',$str);
}


Merci pour votre aide !
Réponse trouvée :

Dans mon expression régulière '#(https?://)([\w\d.&:\#@%/;$~_?\+-=]*)#', '+-=' crée un intervalle entre '+' et '=', et il se trouve qu'en ascii, les signes '<' et '>' sont compris dans cet intervalle ce qui les rendait valides.

Il faut donc échapper le '-' pour ne pas qu'il soit considéré comme le marqueur d'un intervalle, ce qui donne '#(https?://)([\w\d.&:\#@%/;$~_?\+\-=]*)#'