8795 sujets

Développement web côté serveur, CMS

Bonjour,

Je n'arrive pas à matcher mon pattern dans un texte. Le but de ma regex est de matcher toutes les URL, excepté celles qui sont déjà en lien.

De
"Bonjour le <a href='http://www.huhu.com'>monde</a> sur www.alsacreations.com."
J'aimerais arriver à :
"Bonjour le <a href='http://www.huhu.com'>monde</a> sur <a href='www.alsacreations.com'>www.alsacreations.com</a>."

Actuellement ma regex match toutes les url, mais pas celles qui sont déjà des liens.

Une idée ? Smiley sweatdrop
Ça sera peut-être un peu galère de gérer tous les cas (genre URLs dans des images, ou des scripts potentiellements présents dans le code). Tu peux peut-être utiliser un vrai parser DOM pour faire ça ?
j'suis pas sûr de bien comprendre, tu veux matcher les url qui ne sont pas dans une balise a, et seulement celles là, c'est ça? Pour ensuite les mettres dans la balise a proprement?

Fais voir ton pattern^^, j'ai déjà fait une fonction comme ça^^
Bon au final j'ai du découper, en matchant, puis en faisant des sélections sur des critères, pour affiner ma regexp surement pas parfaite (hyper simpliste).
preg_match_all ('#(\S+\.\S+\.\S+)#i', $article['body'], $match);
foreach ($match[0] as $value)
{
	if (strpos($value, '</a>') === false && strpos($value, '="') === false && strpos($value, "='") === false)
	{
		$prefix = (strpos($value, 'http://') === false) ? 'http://' : '' ;
		$article['body'] = str_replace($value, '<a href="'.$prefix.$value.'" target="blank" rel="nofollow">'.$value.'</a>', $article['body']);
	}
}


Voilà pris par le temps je m'en suis remis à ça... Des conseils pour améliorer sont les bienvenues, sachant qu'il peut y avoir des vidéos et des images dans le texte.
Modifié par Aerandir (11 Sep 2009 - 15:12)
je ne comprends absolument pas ton motif:s

j'utilise ça actuellement, mis en place y'a des mois, donc pas corrigé ni optimisé, mais ça fonctionne tout de même^^

preg_match_all('~\swww\.[\w\d\-\.\?\&\/]{6,500}~i',$string,$links);
			foreach($links[0] as $mark){
				$nextL="<a href='http://$mark'  target='_blank'>$mark</a> ";
				$string=str_replace($mark,$nextL,$string);
			}
J'ai une petite idée, je ne sais pas si elle marche :
$chaine = preg_replace(
'#(?<!>)((?:http://|www\.)[^ ]+)\b#',
'<a href="$1">$1</a>',
$chaine);