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

De belles URL en 15 lignes de code !

13 janvier 2014

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 */
	

Cette fonction est utilisée sur Informatix.fr pour ses URL, vous pouvez donc tester son fonctionnement sur toutes les pages du site. 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.

A bientôt !

Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)