Php regex

Fermé
Bilow - 17 juil. 2010 à 13:24
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 - 20 juil. 2010 à 16:11
Bonjour !

J'ai écrit un script PHP qui remplace les URL d'une phrase par des liens cliquables.
Je pense qu'il fonctionne bien, mais il se troñpe de lien lorsau'il y a plusieurs liens dans la phrase.
Et je ne vois vraiment pas comment faire.

Quelqu'un aurait-il une solution ?
Merci !

Code :
$msg = htmlentities("Le lien est : http://domaine.be/hello/index.php#haut?bas ... Voila !");
$lien1 = preg_replace("#(.*)((http|https|ftp|mms)://[^ ]+)(.*)#", "$3://", $msg);
$lien2 = preg_replace("#(.*)((http|https|ftp|mms)://([^ ]+))(.*)#", "$4", $msg);
$lien_encode = str_replace(urlencode("/"), "/", $lien1.urlencode(html_entity_decode($lien2)));
$lien_encode = str_replace(urlencode("#"), "#", $lien_encode);
$lien_encode = str_replace(urlencode("?"), "?", $lien_encode);
$lien_href = "<a href='".$lien_encode."'>".$lien1.$lien2."</a>";
$msg = preg_replace("#(http|https|ftp|mms)://[^ ]+#", $lien_href, $msg);
echo $msg;


Note : Au début, je mets htmlentities(), parce que plus tard, je n'aurai pas le choix (la variable le sera par défaut).
A voir également:

1 réponse

Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
20 juil. 2010 à 16:11
Bonjour,

voila une petite procédure qui fait ce que tu veux, il faudra ajouter l'url_encode je crois, enfin voila :

$msg_base = htmlentities("Le lien est : http://domaine.be/hello/index.php#haut?bas ... Voila et https://www.google.fr/?gws_rd=ssl !");
$msg = $msg_base ;
$new_msg = "";
while(preg_match("#(http|https|ftp|mms)://[^ ]+#", $msg))
{
	$debut_lien = strpos($msg, "http://");
	$temp = strpos($msg, "https://") ;
	if($debut_lien === false || ($temp !== false && $temp <$debut_lien))
		$debut_lien = strpos($msg, "https://") ;
	$temp = strpos($msg, "ftp://") ;
	if($debut_lien === false || ($temp !== false && $temp <$debut_lien))
		$debut_lien = strpos($msg, "ftp://") ; 
	$temp = strpos($msg, "mms://") ;
	if($debut_lien === false || ($temp !== false && $temp <$debut_lien))
		$debut_lien = strpos($msg, "mms://") ;
	
	$fin_lien = strpos($msg, " ", $debut_lien);
	$lien = substr($msg, $debut_lien, $fin_lien-$debut_lien);
	//echo "=>".$lien."<br/>";
	
	$new_msg.=substr($msg, 0, $debut_lien);
	$new_msg.='<a href="'.$lien.'">'.$lien.'</a>';

	$msg = substr($msg, $fin_lien);
}
$new_msg.=$msg;

echo $msg_base."<br/>";
echo $new_msg ;


En espérant que ça te soit utile.

NB : (la fin des liens n'est considéré que comme un espace, si le lien a une virgule après ou s'il est entre parenthèses cette version ne marchera pas, il faudra la modifier ^^)
0