Page 1 sur 2

Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 12:26
par Peyothe
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 !!

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 12:43
par Victor BRITO
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'); 

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 12:58
par Peyothe
Bonjour Victor.

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

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:02
par Victor BRITO
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'); 

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:06
par Peyothe
Oui j'ai bien testé les deux. Cela me renvoie la même chose.

Le problème peux venir d'ailleurs ?

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:09
par Victor BRITO
Fait un

Code : Tout sélectionner

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

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:12
par Peyothe
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.

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:19
par Victor BRITO
Effectue à présent un

Code : Tout sélectionner

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

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:22
par Peyothe
Voila résultat :

Code : Tout sélectionner

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

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:32
par thehawk
Victor regarde l'encodage par défaut , et si PHP reconnnait le bon encodage de caractère :)

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:33
par Victor BRITO
Dans quel codage est édité ton fichier PHP (en UTF-8 ? en ISO-8859-1 ?) ?

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:35
par Peyothe
UTF-8

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:42
par Victor BRITO
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'); 

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 13:44
par Peyothe
Snif,

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

Es ce que le code fonctionne bien chez toi ?

Re: Remplacer caractères spéciaux dans une chaine

Posté : 04 août 2009, 15:13
par Victor BRITO
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