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
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
Re: Remplacer caractères spéciaux dans une chaine
Posté : 04 août 2009, 13:22
par Peyothe
Voila résultat :
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é.
