L’URL Rewriting est beaucoup utilisé de nos jours et cette méthode requiert de savoir nettoyer une chaîne de caractères, c’est-à-dire transformer par exemple « Chaîne à nettoyer » en « chaine-a-nettoyer ».

Nettoyer une chaîne ?

Nettoyer une chaîne, cela signifie simplement remplacer ses caractères accentués, ses espaces, etc. par d’autres caractères. Par exemple on pourra envoyer « Nettoyer une chaîne de caractères » à notre fonction et elle nous renverra « nettoyer-une-chaine-de-caracteres ».

Cela s’utilise principalement pour l’URL Rewriting afin d’obtenir une adresse du style « titre-de-l-article.html » au lieu de « article.php?id=42 ».

Comment ?

Maintenant qu’on a vu ce qu’on voulait faire, passons à l’action. Cette fonction va en fait être rapide à écrire. Commençons déjà par la créer :

Nous n’avons besoin que d’un seul argument : la chaîne à transformer. Nous allons commencer cette fonction par le plus gros : transformer tous les caractères accentués par leurs homologues ASCII (par exemple le « é » ou le « ê » par « e », le « à » par a, etc.).

Nous allons utiliser une fonction PHP qui fera en une seule ligne toutes les transformations qu’on lui aura demandé. Pour cela, il lui faut un array associatif qui contient en clés les caractères à transformer et en valeurs les caractères à utiliser en remplacement. Pour ceux pour qui ça n’aurait pas été très clair, voici l’array en question :

 'a', 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', '@' => 'a',
	'È' => 'e', 'É' => 'e', 'Ê' => 'e', 'Ë' => 'e', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', '€' => 'e',
	'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', 'Ï' => 'i', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
	'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Ö' => 'o', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'ö' => 'o',
	'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'µ' => 'u',
	'Œ' => 'oe', 'œ' => 'oe',
	'$' => 's');
?>

Bien sûr, à vous de le personnaliser si vous le souhaitez afin de remplacer plus ou moins de caractères que ceux présents ici.
Une fois qu’on a notre array, il faut l’utiliser, et cela se fait grâce à la fonction strtr() qui va prendre en premier argument la chaîne à transformer et en second argument l’array associatif utilisé pour la transformation. Voici ce que ça donne :

Ce n’est bien sûr pas fini, mais presque. On va remplacer tous les espaces et tous les caractères non alpha-numériques par des tirets. En gros, tout ce qui n’a pas été remplacé précédemment le sera si ce n’est pas une lettre ou un chiffre.
Nous allons utiliser ici les regex avec la fonction preg_replace() qui permet de remplacer tout ce qui correspond à la regex par, ici, un tiret. Voici ce que ça donne :

Si les regex ne vous sont pas familières, sachez que les « # » ne sont rien de plus que les délimiteurs de la regex. « [^A-Za-z0-9] » signifie un caractère qui n’est pas une majuscule entre A et Z, une minuscule entre a et z ou un chiffre entre 0 et 9 ; en gros, tout caractère non alpha-numérique. Le « + » permet de sélectionner plus d’un caractères à la fois. Ainsi, si nous avons  » ! » dans la chaîne, le « + » permet de les remplacer tous les deux par « -« . Sans le plus, nous aurions obtenu « –« .

Il ne nous reste plus grand-chose maintenant. Nous allons supprimer les tirets en début et fin de chaîne. Ainsi si nous avions obtenu avec les précédentes fonctions « -titre-de-la-news-« , nous allons faire ce qu’il faut pour avoir « titre-de-la-news ». Pour cela, plutôt que de réutiliser inutilement des regex, nous allons utiliser la fonction trim(). Cette fonction peut ne prendre qu’un seul argument, la chaîne de caractères, auquel cas elle supprime les espaces et autres caractères du genre en début et fin de chaîne. Mais nous pouvons lui fournir un second argument, à savoir une chaîne de caractères qui contient tous les caractères à supprimer. Vous l’avez compris, nous allons l’utiliser avec deux arguments :

Pour finir, nous allons mettre toute la chaîne en minuscules avec strtolower() :

Pour ceux qui se poseraient la question, oui, nous aurions pu le faire dès le début de la fonction, ce qui aurait supprimé quelques caractères dans notre array. La raison pour laquelle je ne l’ai pas fait, c’est tout simplement à cause des accents. Si vous voulez gérer l’utf-8 par exemple avec strtolower(), sachez que ce n’est pas possible et qu’il faut passer par d’autres fonctions comme mb_strtolower() qui prend l’encodage que vous utilisez en second argument. J’ai pensé qu’il était plus simple de faire comme je l’ai fait.

En résumé

Voici le code final de notre fonction (j’espère que vous avez pensé au return) :

 'a', 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', '@' => 'a',
		'È' => 'e', 'É' => 'e', 'Ê' => 'e', 'Ë' => 'e', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', '€' => 'e',
		'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', 'Ï' => 'i', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
		'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Ö' => 'o', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'ö' => 'o',
		'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'µ' => 'u',
		'Œ' => 'oe', 'œ' => 'oe',
		'$' => 's');

	$chaine = strtr($chaine, $caracteres);
	$chaine = preg_replace('#[^A-Za-z0-9]+#', '-', $chaine);
	$chaine = trim($chaine, '-');
	$chaine = strtolower($chaine);

	return $chaine;
}
?>