PHP : comment retirer tous les caractères spéciaux d'une chaîne et les convertir en caractères normaux ?

Une fonction permet de remplacer une chaîne de caractères par une autre, et ainsi de convertir des espaces en tirets.

Les URL dans le web ne doivent contenir ni de caractères spéciaux ni d'espaces. Il faut donc traiter les chaînes de caractères avant de les utiliser dans un lien.

La fonction str_replace permet de remplacer une chaîne de caractères par une autre. Elle permet dans ce cas de remplacer les espaces par des tirets. Pour enlever tous les caractères spéciaux, on utilisera la fonction preg_replace qui fonctionne de la même manière mais prend en paramètre les expressions régulières. L'expression régulière [^A-Za-z0-9-] permet de sélectionner tout ce qui n'est pas une lettre, un chiffre ou un tiret. Il suffit de remplacer par une chaîne vide pour supprimer les éléments. Si vous constatez que vous avez plusieurs tirets à la suite dans vos URL, il suffit d'utiliser une expression régulière qui sélectionne les tirets à la suite (on utilise le caractère + qui indique qu'un élément est présent plus d'une fois) et de remplacer par un tiret :

function nettoyerChaine($string) {
$string = str_replace(' ', '-', $string);
$string = preg_replace('/pratique/[^A-Za-z0-9-]/', '', $string);
return preg_replace('/pratique/-+/', '-', $string);
}

L'inconvénient de cette méthode est qu'elle ne gère pas les accents. Les caractères accentués seront enlevés de la chaîne. Pour gérer les accents en UTF-8, la fonction ci-dessous convertira tous les caractères accentués en caractères normaux sans accent :

function enleverCaracteresSpeciaux($text) {
$utf8 = array(
'/[áàâãªä]/u' => 'a',
'/[ÁÀÂÃÄ]/u' => 'A',
'/[ÍÌÎÏ]/u' => 'I',
'/[íìîï]/u' => 'i',
'/[éèêë]/u' => 'e',
'/[ÉÈÊË]/u' => 'E',
'/[óòôõºö]/u' => 'o',
'/[ÓÒÔÕÖ]/u' => 'O',
'/[úùûü]/u' => 'u',
'/[ÚÙÛÜ]/u' => 'U',
'/ç/' => 'c',
'/Ç/' => 'C',
'/ñ/' => 'n',
'/Ñ/' => 'N',
'//' => '-', // conversion d'un tiret UTF-8 en un tiret simple
'/[]/u' => ' ', // guillemet simple
'/[«»]/u' => ' ', // guillemet double
'/ /' => ' ', // espace insécable (équiv. à 0x160)
);
return preg_replace(array_keys($utf8), array_values($utf8), $text);
}

Pour ensuite avoir un côté plus SEO-Friendly pour notre URL, il faut mettre tous les caractères en minuscules (fonction strlower), et utiliser les expressions régulières vues précédemment pour enlever les espaces et les caractères spéciaux non encore gérés. On peut également ajouter un dictionnaire pour les cas particuliers qui demandent une transformation spécifique.

function transformerEnURL($string) {
$dict = array(I'm => I am);
return strtolower(preg_replace(array( '#[s-]+#', '#[^A-Za-z0-9. -]+#' ), array( '-', '' ), enleverCaracteresSpeciaux(str_replace(array_keys($dict), array_values($dict), urldecode($string)))));
}

PHP