Comment construire une URL sans caractères spéciaux en PHP ?

Remplacer les accents par leur équivalent dans une URL.

Même si la plupart des navigateurs le permettent, il est fortement déconseillé d'avoir des caractères spéciaux dans une URL. Le code ci-dessous remplace intelligemment ces caractères spéciaux par leurs équivalents.

Remplacer les caractères spéciaux dans une URL

function encode($chaine) { $chaine = trim($chaine); $chaine = htmlentities($chaine, ENT_NOQUOTES, 'UTF-8'); $patterns = array( /* lettres speciales : 'é' => 'e', 'ç' => 'c' */ '#&([A-Za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', /* ligatures : 'œ' => 'oe' */ '#&([A-Za-z]{2})(?:lig);#', /* caracteres speciaux restant : '&' => '', '?' => '' */ '#&[^;]+;#', '#([^a-z0-9/]+)#i', ); $remplacements = array( '\1', '\1', '', '-', ); $chaine = preg_replace($patterns, $remplacements, $chaine); $chaine = strtolower($chaine); return $chaine; } echo encode("La réponse à la question sur la vie, l'univers et le reste est 42"); /* Affichage : la-reponse-a-la-question-sur-la-vie-l-univers-et-le-reste-est-42 */ /* Alors qu'un simple urlencode donne un resultat beaucoup moins joli : */ echo urlencode("La réponse à la question sur la vie, l'univers et le reste est 42"); /* Affichage : La+r%C3%A9ponse+%C3%A0+la+question+sur+la+vie%2C+l%27univers+et+le+reste+est+42 */

Attention, cette fonction ne remplace pas les slashs '/', elle peut ainsi être utilisée sur une URL complète au lieu de l'exécuter partie par partie.