Php regex

Bilow -  
Defouille Messages postés 404 Statut Membre -
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).

1 réponse

  1. Defouille Messages postés 404 Statut Membre 54
     
    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