Combine: Enlever tous les accents

Problèmes, bugs et difficultés rencontrés sur le site.
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Combine: Enlever tous les accents

Message par sly »

Dominique a écrit : Note pour les programmeurs: j'ai trouvé une méthode générale et ultra simple pour enlever tous les accents:
preg_replace ('/&(\w)\w+;/', '$1', htmlentities ($titre))
A réutiliser sans modération (il doit y avoir une fonction comme ça quelque part dans le code WRI) :wink:
C'est vraiment une combine de sioux ! Il fallait le remarquer que toutes les entités HTML représentant des lettres accentuées commence par la lettre elle même.

Toutefois, si cela semble ne pas trop mal marcher, les problèmes risques d'apparaître dès que ton $titre va contenir des éléments convertible en htmlentities.

exemple avec la chaine :
$titre = "é<>&€"²";

qui se retrouve alors convertie en :
"elgaeqs"
Avatar du membre
Dominique
Messages : 3705
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

Un poil plus compliqué, mais traite tous les caractères accentués qui se présenteront et pas les autres

$s = "éãÃäÄæÆçÇéÉêÊèÈ<>&€\"²"; ;
$s = preg_replace ('/(\w)/u', '[$1]', $s); // On encadre par des [] tous les caractères alphanum unicodes (donc y compris les accentués)
$s = preg_replace ('/[(\w)]/', '$1', $s); // On enlève les [] sur les alphanum (donc reste les accentués)
$s = htmlentities ($s, ENT_IGNORE, 'UTF-8', false); // On expanse tout
$s = preg_replace ('/\[&(\w)\w+;\]/', '$1', $s); // On isole la première lettre des encadrés []
$s = html_entity_decode ($s, NULL, 'UTF-8'); // On recode UTF-8 ce qui reste expansé
echo $s;
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Message par sly »

j'ai essayé ton code et il ne se passe rien.

Sinon, j'ai trouvé une combine assez intéressante, qui pousse un peu plus loin le concept de "tenter de rendre un truc potable vers le charset ASCII" (qui finalement est le charset qu'on vise)

En permettant par exemple de convertir œ en oe, le ß en ss, et d'autre conversion autorisant plus de caractère en sortie qu'en entrée.

Code : Tout sélectionner

$s="éãÃäÄæÆçÇéÉêÊèÈ<>&€\"²";
print&#40;$s."\n"&#41;;
print&#40;iconv&#40;"UTF-8", 'ASCII//TRANSLIT//IGNORE', $s&#41;."\n"&#41;;
=> eaAaAaeAEcCeEeEeE<>&EUR"?
On constate toutefois que le ² est passé à la trappe pour finir en "?" mais on remarque la finesse de ne pas dégager complètement le € pour en faire un truc compréhensible.

Enfin bref, ça fait bien un paquet de cheveux coupés en 4 pour pas grand chose, ce truc n'étant utilisé qu'a 3 endroits :
- Les urls de points : http://sly.refuges.info/point/4025/lac/ ... -2-bornes/
- les urls de polygones http://sly.refuges.info/nav/351/zone/Pyrenees/
- et pour le nom de fichier proposé suite à une exportation
Avatar du membre
leosw
Messages : 539
Enregistré le : 28 févr. 2013, 17:28
Localisation : Montagne noire

Message par leosw »

Lut,

J'ai utilisé une fonction comme ça dans mon code ici : https://github.com/sletuffe/www.refuges ... eojson#L43

Elle permet d'enlever tous les accents ET de remplacer les espaces par _.

C'est directement inspiré de WordPress et de ce qui est utilisé pour créer les ID à partir du titre de l'article, voici le code :

Code : Tout sélectionner

$champ = preg_replace&#40;'~&&#40;&#91;a-z&#93;&#123;1,2&#125;&#41;&#40;?&#58;acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron&#41;;~i', '$1', htmlentities&#40;$champ, ENT_COMPAT, 'UTF-8'&#41;&#41;; // On enlève tous les accents
$champ = preg_replace&#40;'/&#91;^a-zA-Z0-9&#93;/',"_", $champ&#41;; // on remplace tout ce qu'il reste par des _
$champ = mb_strtolower&#40;$champ&#41;; // on met tout en minuscule
La première ligne sers à faire ce que vous voulez et fonctionne.

Léo
Avatar du membre
Claude Mauguier
Messages : 4233
Enregistré le : 16 févr. 2005, 01:00
Localisation : Isére

Message par Claude Mauguier »

Enlever tous les accents... c'est vrai ça ! On se demande même pourquoi le site est encore écrit dans une langue de ploucs : le français (enfin, quand je dis "écrit"...), isn't it ??
Avatar du membre
Dominique
Messages : 3705
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

Claude Mauguier a écrit :Enlever tous les accents... c'est vrai ça ! On se demande même pourquoi le site est encore écrit dans une langue de ploucs : le français (enfin, quand je dis "écrit"...), isn't it ??
En fait, c'est la bonne question !
Si on veut enlever les accents, c'est que ça fait planter un bout de code (clé d'accès, ...)
Donc, il ne faut pas garder les &<+>%$ non plus
raison pour laquelle je suis resté sur ma fonction initiale, même si elle rend elgaeqs

Dans tous les autres cas, on gardera les caractères accentués
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Message par sly »

C'est en effet une bonne question : "au fait, c'est pour quoi faire ?"
Dominique a écrit : Si on veut enlever les accents, c'est que ça fait planter un bout de code (clé d'accès, ...)
Ben même pas. (C'est quoi cette histoire de clé d'accès ?)
ça n'est utile, à ma connaissance, que aux trois endroits que j'ai cité, plus celui de léo (dont j'ignore d'ailleurs pourquoi il ne laisse pas en UTF-8 avec tous les accents ?)

En clair, ça n'est une combine que pour que les url puissent avoir un "sens" et un peu de "cosmétique" et de simplicité à "copier/coller" pour l'internaute, mais pas pour contourner un bug.
Dominique a écrit : Donc, il ne faut pas garder les &<+>%$ non plus
exact
raison pour laquelle je suis resté sur ma fonction initiale, même si elle rend elgaeqs
Mais c'est moins lisible car des lettres sans aucun sens peuvent être injectées.

Et sinon, à part ça, on veut changer un truc de peu d'importance qui marche par un autre truc de peu d'importance qui marche aussi ? On est à ce point là désœuvré ? ;-)
Avatar du membre
Dominique
Messages : 3705
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

sly a écrit :Et sinon, à part ça, on veut changer un truc de peu d'importance qui marche par un autre truc de peu d'importance qui marche aussi ? On est à ce point là désœuvré ? ;-)
C'est du pur plaisir théorique :satan:

Tout est parti d'un bug OL qui traînait sur l'affichage d'un ë en étiquette d'icone que j'ai lâchement contourné en supprimant provisoirement les accents de l'extraction chemineur (la vrai solution consistant à chercher pourquoi ça bug)
Ensuite, j'étais très content de ma trouvaille, de la première lettre des htmlentities et voulais la faire partager à ceux que ça pourrait intéresser
Mais c'est :ours: qui a raison: il vaut mieux ne pas avoir à enlever les accents

Pour le "code", je pensais à la traduction du type de point en nom d'icône que, sur chemineur, je fais en enlevant les caractères bizarres, ce qui m'évite une table de traduction :oops:
Ceci est invisible de l'internaute mais, là aussi, la table de traduction est la vrai réponse
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Message par sly »

Dominique a écrit : C'est du pur plaisir théorique :satan:
Ha bon ! alors tout va bien, on peut continuer à causer ;-)
d'un ë en étiquette d'icone que j'ai lâchement contourné (...)
En effet, la vrai solution, elle se situe par là ;-)
Ensuite, j'étais très content de ma trouvaille (...)
Et moi de la mienne, j'ai découvert le mode //TRANSLIT de iconv qui permet de grandement simplifier le code et de tenter de faire une "représentation" acceptable.
Mais c'est :ours: qui a raison: il vaut mieux ne pas avoir à enlever les accents
C'est bien vrai, et sur wri j'ai tout tenté pour l'éviter, j'étais même prêt à le faire en disant "tant pis pour les vieux navigateurs", mais la raison m'a rattrapée, il y a tellement d'outils, de logiciel email, de navigateurs qui vont charcuter cette URL en %23t%45 que ça en deviendra illisible alors que c'est justement le but (sinon je ferais tout en http://www.refuges.info/point/2912 sans froufrou ni chichis), c'est yip qui a fait la remarque ici : http://www.refuges.info/forum/viewtopic ... 7950#17950
Pour le "code", je pensais à la traduction du type de point en nom d'icône que, sur chemineur, je fais en enlevant les caractères bizarres
Ou alors, tu peux jouer le concept de l'ours jusqu'au bout et nommer ton fichier d'icone avec tous les accents, espace et caractère bizarres nécessaires (Sous linux, sauf erreur seul 2 caractères sont interdits dans un nom de fichier : le "/" et le "\0" (fin de chaine)
Avatar du membre
Dominique
Messages : 3705
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

sly a écrit :
Mais c'est :ours: qui a raison: il vaut mieux ne pas avoir à enlever les accents
C'est bien vrai, et sur wri j'ai tout tenté pour l'éviter, j'étais même prêt à le faire en disant "tant pis pour les vieux navigateurs", mais la raison m'a rattrapée, il y a tellement d'outils, de logiciel email, de navigateurs qui vont charcuter cette URL en %23t%45 que ça en deviendra illisible alors que c'est justement le but (sinon je ferais tout en http://www.refuges.info/point/2912 sans froufrou ni chichis), c'est yip qui a fait la remarque ici : http://www.refuges.info/forum/viewtopic ... 7950#17950
Bof. S'il y bien un endroit où j'oubierais les caractères spéciaux, c'est bien une url
Pour le "code", je pensais à la traduction du type de point en nom d'icône que, sur chemineur, je fais en enlevant les caractères bizarres
Ou alors, tu peux jouer le concept de l'ours jusqu'au bout et nommer ton fichier d'icone avec tous les accents, espace et caractère bizarres nécessaires (Sous linux, sauf erreur seul 2 caractères sont interdits dans un nom de fichier : le "/" et le "\0" (fin de chaine)
... et un nom de fichier

Sur ces deux points, on est bien dans la technique, pas dans l’expression litéraire
Voyons comment les littéraires appellent la page "Les fiches les plus visitées" : http://www.critiqueslibres.com/i.php/list/topcptr_new