Remplacer caractères spéciaux dans une chaine

Eléphanteau du PHP | 13 Messages

04 août 2009, 12:26

Bonjour à tous,

Dans le cadre de la mise en place d'un système d'URL Rewriting, j'essaie de transformer des chaines représentant des noms en chaine propre pour les URLS.

J'ai fais plusieurs recherches et trouvé plusieurs fonctions qui faisais cette transformation, or aucune ne fonctionne correctement. Je pense que j'ai un problème d'encodage.

Voici mon code :
function simpleName($chaine){
	//	les accents
	$chaine = trim($chaine);
	$chaine = strtr($chaine,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","aaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
	//	les caracètres spéciaux (autres que lettres et chiffres en fait)
	$chaine = preg_replace('/([^.a-z0-9]+)/i', '', $chaine);
	$chaine = strtolower($chaine);
	return $chaine;
}

echo (simpleName('Hôtel Plazza'));
Je souhaiterai obtenir le résultat : hotelplazza or j'obtiens hnutelplazza

Auriez vous une explication ? Merci !!

Mammouth du PHP | 2937 Messages

04 août 2009, 12:43

Il y a code plus simple, grâce à la fonction iconv () :

Code : Tout sélectionner

function simpleName ($chaine) {   // Le premier paramètre de la fonction iconv () est à adapter au codage de caractères utilisé par tes chaînes   // (ex. : 'ISO-8859-1' si les chaînes de caractères utilisent ce codage)   $string = iconv ('UTF-8', 'US-ASCII//TRANSLIT//IGNORE', $chaine);   $string = preg_replace ('#[^.0-9a-z]+#i', '', $string);   $string = strtolower ($string);   return $string; } // Affiche hotelplazza echo simpleName ('Hôtel Plazza'); 

Eléphanteau du PHP | 13 Messages

04 août 2009, 12:58

Bonjour Victor.

Ce code ne fonctionne pas chez moi. Cela me renvoie htelplazza

Mammouth du PHP | 2937 Messages

04 août 2009, 13:02

Bonjour Victor.

Ce code ne fonctionne pas chez moi. Cela me renvoie htelplazza
Quel codage utilises-tu ? de l'ISO-8859-1 ? Si c'est le cas, remplace 'UTF-8' par 'ISO-8859-1' (j'ai, pourtant, laissé un commentaire allant dans ce sens dans ma suggestion de code… :-* ).

Code : Tout sélectionner

// Code pour de l'ISO-8859-1 function simpleName ($chaine) {   $string = iconv ('ISO-8859-1', 'US-ASCII//TRANSLIT//IGNORE', $chaine);   $string = preg_replace ('#[^.0-9a-z]+#i', '', $string);   $string = strtolower ($string);   return $string; } // Affiche hotelplazza echo simpleName ('Hôtel Plazza'); 
Modifié en dernier par Victor BRITO le 04 août 2009, 13:06, modifié 1 fois.

Eléphanteau du PHP | 13 Messages

04 août 2009, 13:06

Oui j'ai bien testé les deux. Cela me renvoie la même chose.

Le problème peux venir d'ailleurs ?

Mammouth du PHP | 2937 Messages

04 août 2009, 13:09

Fait un

Code : Tout sélectionner

var_dump (iconv_get_encoding ()); 
et dis-moi le résultat retourné.

Eléphanteau du PHP | 13 Messages

04 août 2009, 13:12

Ca retourne :

Code : Tout sélectionner

array(3) { ["input_encoding"]=> string(10) "ISO-8859-1" ["output_encoding"]=> string(10) "ISO-8859-1" ["internal_encoding"]=> string(10) "ISO-8859-1" }
Et j'ai bien mis ISO-8859-1 dans la fonction comme tu l'as précisé dans le commentaire.

Mammouth du PHP | 2937 Messages

04 août 2009, 13:19

Effectue à présent un

Code : Tout sélectionner

var_dump (mb_detect_encoding ('Hôtel Plazza au cœur… €')); 

Eléphanteau du PHP | 13 Messages

04 août 2009, 13:22

Voila résultat :

Code : Tout sélectionner

string(5) "UTF-8"
Je comprends pas ce que je fais la ^^

Mammouth du PHP | 991 Messages

04 août 2009, 13:32

Victor regarde l'encodage par défaut , et si PHP reconnnait le bon encodage de caractère :)
DevOps, Symfony4, Hoa

Mammouth du PHP | 2937 Messages

04 août 2009, 13:33

Dans quel codage est édité ton fichier PHP (en UTF-8 ? en ISO-8859-1 ?) ?

Eléphanteau du PHP | 13 Messages

04 août 2009, 13:35

UTF-8

Mammouth du PHP | 2937 Messages

04 août 2009, 13:42

Dans ce cas, essaie comme suit (avec un utf8_encode ()) :

Code : Tout sélectionner

function simpleName ($chaine) {   $string = iconv ('UTF-8', 'US-ASCII//TRANSLIT//IGNORE', utf8_encode ($chaine));   $string = preg_replace ('#[^.0-9a-z]+#i', '', $string);   $string = strtolower ($string);   return $string; } // Affiche hotelplazza echo simpleName ('Hôtel Plazza'); 

Eléphanteau du PHP | 13 Messages

04 août 2009, 13:44

Snif,

Pas mieux ... j'obtiens htelplazza .. Je désepère ...

Es ce que le code fonctionne bien chez toi ?

Mammouth du PHP | 2937 Messages

04 août 2009, 15:13

Est-ce que le code fonctionne bien chez toi ?
Le premier code que j'ai suggéré fonctionne bien chez moi (codage en UTF-8). Il en est de même pour celui qui tient compte du codage ISO-8859-1.

Je suis donc surpris pourquoi il en est autrement de ton côté. :-k