Page 1 sur 1

Supprimer les accentuations

Posté : 07 nov. 2007, 20:08
par Gofromiel
Après des heures à rechercher une fonction simple qui me permettrait de supprimer les accentuations il a fallut que je me rende à l'évidence : on est jamais mieux servit que pas soit même :-) La plupart des exemples que j'ai trouvé sont basés sur la substitution de caractères accentués par des caractères non accentués. Cela pourrait être simple, mais avec les divers formats d'encodage de caractères c'est vraiment trop la misère pour avoir quelque chose qui marche. Voici donc ma solution.

J'utilise la fonction htmlentities() pour transformer les caractères spéciaux en valeurs échappées e.g. "é". J'utilise ensuite preg_replace() pour récupérer le caractère non accentué (la première lettre de la séquence d'échappement). Bref, c'est tout simple et ça marche au poil :
$title = strtolower(htmlentities($title, ENT_QUOTES, 'utf-8'));

$title = preg_replace('#\&([aeiouc])[a-z]+\;#', '\1', $title);
$title = preg_replace('#\&[a-z]+\;#', '', $title);
Enjoy !

Posté : 07 nov. 2007, 22:41
par Cyrano
Futé... mais comment tu fais avec œ par exemple ;) le cœur va devenir un cour avec ton système :-k

Posté : 07 nov. 2007, 22:47
par naholyr
Et "↑" (↑) deviendra "u", "&copy" (©) deviendra "c", etc…
Peut mieux faire ;)

À ta place je fixerais la condition non sur le premier caractère mais plutôt sur la suite : uml (tréma), circ (accent circonflexe), tilde (tilde), acute (accent aigu), grave (accent grave).
Soit une expression régulière du genre '#&(.)(?:uml|circ|tilde|acute|grave);#'

Posté : 07 nov. 2007, 23:52
par Gofromiel
Mince, j'aurais du préciser que j'y ai réfléchis 30 secondes flash éclair et que c'est pour nommer vite fait des fichiers.

@naholyr: Très bonne idée la condition '#&(.)(?:uml|circ|tilde|acute|grave);#', il faudrait juste y ajouter 'cedil' et 'ring' et c'est bon (je pense...). Ce qui nous donne:
$title = strtolower(htmlentities($title, ENT_QUOTES, 'utf-8'));

$title = preg_replace('#\&(.)(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $title);
$title = preg_replace('#\&(.{2})(?:lig)\;#', '\1', $title); // pour 'œ'...
$title = preg_replace('#\&[a-z]+\;#', '', $title);
Et voilà !

Posté : 30 déc. 2007, 15:05
par fab4real
Merci pour ces précisions, j'ai galéré sur Google ils m'indiquaient tous la technique de remplacement qui marchait pas dans mon cas ( comme toi pour gérer des noms de pages et générer des pages html)

Code : Tout sélectionner

function removeaccents($string) { $string = strtolower(htmlentities($_POST["url"], ENT_QUOTES, 'utf-8')); $string = preg_replace('#\&(.)(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $string); $string = preg_replace('#\&(.{2})(?:lig)\;#', '\1', $string); // pour 'œ'... $string = preg_replace('#\&[a-z]+\;#', '', $string); return $string; } ;
J'l'ai transformé en fonction et moi perso j'ai rajouté un trim ;)

Enfin merci et faudrait sérieusement penser à upper ce topic sur google dans la recherche 'enlever accents php" qui affiche que la technique de substr qui est un peu pourrie............. :)

Posté : 30 déc. 2007, 15:20
par Sékiltoyai
Oui mais le problème c'est que nous ne contrôlons pas Google :-/
Le seul truc qu'on pourrait faire c'est mettre un lien quelquepart vers ce sujet mais ce serait surcharger la page d'index…

Posté : 30 déc. 2007, 16:25
par momox
Perso j'utilisais ceci pour enlever tous les caractéres spéciaux que je pouvais avoir...
function url_encode($str) {
	$str = strtr($str, 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝ', 'AAAAAACEEEEEIIIINOOOOOUUUUY');
	$str = strtr($str, 'áàâäãåçéèêëíìîïñóòôöõúùûüýÿ', 'aaaaaaceeeeiiiinooooouuuuyy');
	$str = str_replace('.', '', $str);
	$str = preg_replace('/([^a-z0-9]+)/i', '_', $str);
	$str = strtolower($str);
    return $str;
}
@++ ;)

Posté : 30 déc. 2007, 17:00
par fab4real
C'est exactement la technique qui ne marchait pas :D
Tes 2 lignes strtr ne fonctionnaient pas!
Ca me retournait des "no" à la place des accents("éà" devenait "nono" :D) , ou alors me remplaçait la lettre accentuée par une mauvaise lettre..

Peut etre que ça ne marche pas avec un charset utf ?! Je ne vois que ça..

Pour google je plaisantais ;)

Posté : 30 déc. 2007, 17:54
par Gofromiel
@momox: strtr() est une m*rde avec l'UTF-8 (le charset qu'on devrait tous utiliser). Certains caractères accentués occupent plus de 8 bits, du coup toutes les fonctions de substitution de caractères produisent des résultats erronés, d'où le recours à htmlentities() pour échapper nos caractères exotiques à la langue anglaise.

Posté : 30 déc. 2007, 18:37
par momox
Perso pour le moment, je n'ai pas entamé ma migration sous utf-8...
J'en reste a l'iso-8859-1...
Faudrait que je m'y mette un jour mais j'ai la flemme de réencoder tous mes fichiers, mes bases de données, etc...
L'utf-8, c'est bien ... quand on a commencé avec...

Posté : 30 déc. 2007, 23:46
par Victor BRITO
Cette fonction suppose qu'on utilise idéalement UTF-8, car œ, qui n'est pas reconnu par ISO-8859-1, ne pourra pas être converti en œ sous ce dernier codage.

Posté : 31 déc. 2007, 01:26
par Gofromiel
C'est pour ça qu'il faut passer à l'UTF-8, l'ISO c'est tout nul :-P

Une règle générale : si on utilise n'importe quoi n'importe où on obtient mystérieusement n'importe quoi.

Posté : 31 déc. 2007, 11:45
par momox
Quelqu'un connait t'il un utilitaire pour tout convertir en utf-8 simplement ? :P