Php regex
Bilow
-
Defouille Messages postés 404 Statut Membre -
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 :
Note : Au début, je mets htmlentities(), parce que plus tard, je n'aurai pas le choix (la variable le sera par défaut).
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
-
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 ^^)