problème de génération d'url à partir d'un texte

WRInaute passionné
Salut,

De manière à générer automatiquement des url de page à partir d'un champ de saisie (par ex. le titre d'un texte), j'utilise une fonction php inspirée d'urlencode() mais prenant en compte un plus grand nombre de caractères (via des str_replace() en série).

Mon problème c'est qu'il semble y avoir un problème de reconnaissance des caractères spéciaux, suivant les utilisateurs.

Par exemple, si je saisie "le corbeau et le renard" ma fonction va bien remplacer les espaces pas des tirets et me donner "le-corbeau-et-le-renard" mais avec certains utilisateurs, je vais obtenir : "le%20corbeau%20et%20le%20renard", bref les espaces ne sont pas reconnus et donc pas remplacés.

Ceci est également valable pour d'autres caractères.

Je penche pour les cas de figure où le texte est copier / coller à partir d'une application du type MS Word, dans laquelle les caractères ont un codage spécial, mais je ne sais pas comment faire pour créer une fonction gérant tous les cas de figure...

Fab
 
WRInaute passionné
Ok voici la fonction que j'appelle à différents endroits :

Code:
function mon_urlencode($url)
 {
 $url=strtolower(trim(stripslashes($url)));

 //--caractères supprimés.
 $url=str_replace("…","",$url);
 $url=str_replace("«","",$url);
 $url=str_replace("«","",$url);
 $url=str_replace("»","",$url);
 $url=str_replace("»","",$url);
 $url=str_replace("!","",$url);
 $url=str_replace("?","",$url);
 $url=str_replace("\"","",$url);
 $url=str_replace("/","",$url);
 $url=str_replace(":","",$url);
 $url=str_replace(")","",$url);
 $url=str_replace("#","",$url);
 $url=str_replace(".","",$url);
 $url=str_replace(",","",$url);
 $url=str_replace("%","",$url);

 //--caractères remplacés.
 $url=str_replace(" ","-",$url);
 $url=str_replace("'","-",$url);
 $url=str_replace("’","-",$url);
 $url=str_replace("(","-",$url);
 $url=str_replace("_","-",$url);
 $url= str_replace("--", "-", $url);
 $url= str_replace("&", "et", $url);
 $url=str_replace("é","e",$url);
 $url=str_replace("è","e",$url);
 $url=str_replace("ê","e",$url);
 $url=str_replace("ë","e",$url);
 $url=str_replace("à","a",$url);
 $url=str_replace("â","a",$url);
 $url=str_replace("ä","a",$url);
 $url=str_replace("ù","u",$url);
 $url=str_replace("û","u",$url);
 $url=str_replace("ü","u",$url);
 $url=str_replace("ï","i",$url);
 $url=str_replace("î","i",$url);
 $url=str_replace("ô","o",$url);
 $url=str_replace("ö","o",$url);
 $url=str_replace("ç","c",$url);
 
 return $url;
 }

Elle est toute simple et marche très bien quand c'est moi qui saisie, mais avec certaines personnes, ça ne passe pas...

Fab
 
WRInaute occasionnel
Fab le Fou a dit:
Je penche pour les cas de figure où le texte est copier / coller à partir d'une application du type MS Word, dans laquelle les caractères ont un codage spécial, mais je ne sais pas comment faire pour créer une fonction gérant tous les cas de figure...
En prenant le problème à l'inverse ?
N'accepter par exemple que abcd...z012...9 et remplacer tout le reste par un tiret.
 
WRInaute passionné
Pourquoi tu n'utilise pas un code beaucoup moin long
Code:
function suppaccents($mot){ 
$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"; 
$ssaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"; 
return(strtr($mot,$accents,$ssaccents)); 
}
 
WRInaute passionné
En fait, le nom de ma variable est mal choisi.

Il s'agit en fait d'un texte que je transmets à ma fonction et non d'une url.
Le texte en question provient d'un des champs de ma bd mysql.

Au final, la solution de jerome347 ne convient pas non plus, puisque je ne souhaite pas remplacer tous les caractères spéciaux par des tirets (par ex. "à" est remplacé par "a", cf la fonction).

Ce que je ne comprends pas c'est pourquoi ma fonction n'arrive pas toujours à reconnaître les caractères qui sont listés.

Mon histoire de MS Word est une supposition, mais c'est étrange puisque quand on recopie un texte dans un champ de formulaire et à fortiori quand il a été enregistré dans la base, le codage Word devrait disparaître, non ?
 
WRInaute occasionnel
Dans la doc de strtr sur php.net :

To replace unicode characters with their ascii equivalents, use

$my_string = strtr($my_string, $unicode_array);

using this array:

$unicode_array = array(
"–" => "-",
"—" => "-",
"–" => "-",
"‘" => "'",
"’" => "'",
"’" => "'",
"‘" => "'",
"…" => "...",
"…" => "...",
"“" => "\"",
"“" => "\"",
"”" => "\"",
"”" => "\"",
);

It is important to note you need both the unicode contol character (”) AND its text equivalent (”). For instance, text copied and pasted into your html form from M$ Word will have the control character, whereas the same text viewed in a browser and copied into your html form using drag-and-drop will have the text equivalent.

A pox on Redmond for the way M$ Word is set to convert all these characters to unicode equivalents by default.
 
WRInaute occasionnel
J'ai aussi trouvé cette fonction :

function un_microsuck($text){
static $chars = array(
128 => '€',
130 => '‚',
131 => 'ƒ',
132 => '„',
133 => '…',
134 => '†',
135 => '‡',
136 => 'ˆ',
137 => '‰',
138 => 'Š',
139 => '‹',
140 => 'Œ',
142 => 'Ž',
145 => '‘',
146 => '’',
147 => '“',
148 => '”',
149 => '•',
150 => '–',
151 => '—',
152 => '˜',
153 => '™',
154 => 'š',
155 => '›',
156 => 'œ',
158 => 'ž',
159 => 'Ÿ');
$text = str_replace(array_map('chr', array_keys($chars)), $chars,
$text);
return $text;
}
 
WRInaute passionné
A mon avis la deuxième fonction devrait coller.

Je vais donc l'ajouter à mon code et voir ce que ça donnera lorsqu'un de mes auteurs ajoutera un texte (bah oui, comme j'utilise OpenOffice, moi je n'ai jamais de problèmes :wink: ...)

En tous cas merci, bonne trouvaille !

Je viendrai mettre à jour ce topic si je me rends compte qu'il est nécessaire d'ajouter certaines occurences à la fonction.

@+, Fab
 
WRInaute passionné
Je reviens sur ce problème car même avec la fonction précédente il reste des erreurs avec les espaces et c'est souvent eux qui me posent des problèmes en me générant des url non conformes...

En fait il faudrait ajouter à la fonction suivante la gestion des différents codages générant des espaces sur ms word, mais pas moyen de trouver l'info sur le web...

Si quelqu'un a une version de MS Office sur son PC, il me semble que tous les codes se trouvent dans l'aide de VBA (notamment d'Access).
 
Discussions similaires
Haut