PHP Expression régulière : rendre clickable toutes les url d'un texte

Nouveau WRInaute
Bonjour,

je souhaiterais remplacer toutes les url non balisé d'un texte par des url cliquable <a href=""> sauf les url d'images qui sont dans une balise src=""

Le code ci dessous fonctionne très bien sauf qu'il me remplace également les url des images. Comment modifier mon expression régulière de manière à excluse les urls images qui sont dans une balise src="" ?

function replace_url_in_text ($text){
$in = array('`((?:https?|ftp)://\S+[[:alnum:]]/?)`si');
$out = array('<a href="$1">$1</a>');
return preg_replace($in, $out, $text);
}

$texte = 'Ceci est un exemple http://www.domainaremplacer.com et <img src="http://domain.com/exemple/test.jpg" />';
echo replace_url_in_text($texte);

Résultat :
----------

Ceci est un exemple <a href="http://www.domainaremplacer.com">http://www.domainaremplacer.com</a> et <img src="<a href="http://domain.com/exemple/test.jpg">http://domain.com/exemple/test.jpg</a>" />

Quelqu'un pourrait m'aider ?

merci
 
Nouveau WRInaute
Ah super, merci infiniment.

Ce qu'un homme sème il le récoltera ! Merci pour cette semence.

ps : Serait-il possible de modifier encore un peut la fonction pour qu'elle traite également les url sans les http:// mais avec les www sous la forme www.domain.tdl ?
 
WRInaute impliqué
A première vue, cette modif devrait faire l'affaire, mais elle va faire n'importe quoi si elle rencontre une url du genre xxx.www.example.com :

Code:
function autolink($str, $attributes=array()) {
	$attrs = '';
	foreach ($attributes as $attribute => $value) {
		$attrs .= " {$attribute}=\"{$value}\"";
	}

	$str = ' ' . $str;
	$str = preg_replace(
		'`([^"=\'>])((http|https|ftp)://[^\s<]+[^\s<\.)])`i',
		'$1<a href="$2"'.$attrs.'>$2</a>',
		$str
	);
	$str = preg_replace(
		'`([^"=\'>\/])(www\.[^\s<]+[^\s<\.)])`i',
		'$1<a href="http://$2"'.$attrs.'>$2</a>',
		$str
	);
	$str = substr($str, 1);
	
	return $str;
}

edit: en fait, ca va faire n'imp' avec une url qui contiendra "www." qui ne soit pas précédé de "/" (ex : example.com/xxx.www.html).
Perso, je ne l'utiliserai pas :roll:
 
Nouveau WRInaute
Ce qui serait intéressant c'est de faire une expression régulière comme webrank info le fait, elle pourrait être exécuter avant autolink() et elle aurait pour objectif d'ajouter "http://" devant toutes les urls du texte qui commence par "www." et qui ne serait pas dans des balises html.

Seriez vous en mesure de le faire ?
 
Nouveau WRInaute
seebz a dit:
A première vue, cette modif devrait faire l'affaire, mais elle va faire n'importe quoi si elle rencontre une url du genre xxx.www.example.com :

Code:
function autolink($str, $attributes=array()) {
	$attrs = '';
	foreach ($attributes as $attribute => $value) {
		$attrs .= " {$attribute}=\"{$value}\"";
	}

	$str = ' ' . $str;
	$str = preg_replace(
		'`([^"=\'>])((http|https|ftp)://[^\s<]+[^\s<\.)])`i',
		'$1<a href="$2"'.$attrs.'>$2</a>',
		$str
	);
	$str = preg_replace(
		'`([^"=\'>\/])(www\.[^\s<]+[^\s<\.)])`i',
		'$1<a href="http://$2"'.$attrs.'>$2</a>',
		$str
	);
	$str = substr($str, 1);
	
	return $str;
}

edit: en fait, ca va faire n'imp' avec une url qui contiendra "www." qui ne soit pas précédé de "/" (ex : example.com/xxx.www.html).
Perso, je ne l'utiliserai pas :roll:

J'ai rajouté une ligne à votre code et ca semble régler le problème :

Code:
$text  = ' ' . $text;
		$text  = preg_replace ('`([ ,;:!\|\.\?\\n])(www\.[^\s<]+[^\s<\.)])`i', '$1http://$2', $text);// replace www.domain.tdl => http://www.domain.tdl
		$text  = preg_replace('`([^"=\'>])((http|https|ftp)://[^\s<]+[^\s<\.)])`i', '$1<a href="$2"'.$attrs.'>$2</a>', $text);
		$str   = substr($text, 1);
 
Discussions similaires
Haut