Supprimer les accentuations

Eléphant du PHP | 121 Messages

07 nov. 2007, 20:08

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 !

Mammouth du PHP | 19672 Messages

07 nov. 2007, 22:41

Futé... mais comment tu fais avec œ par exemple ;) le cœur va devenir un cour avec ton système :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

07 nov. 2007, 22:47

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);#'

Eléphant du PHP | 121 Messages

07 nov. 2007, 23:52

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à !

Petit nouveau ! | 2 Messages

30 déc. 2007, 15:05

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............. :)

ViPHP
ViPHP | 5924 Messages

30 déc. 2007, 15:20

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…

Mammouth du PHP | 1511 Messages

30 déc. 2007, 16:25

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;
}
@++ ;)

Petit nouveau ! | 2 Messages

30 déc. 2007, 17:00

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 ;)

Eléphant du PHP | 121 Messages

30 déc. 2007, 17:54

@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.

Mammouth du PHP | 1511 Messages

30 déc. 2007, 18:37

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...

Mammouth du PHP | 2937 Messages

30 déc. 2007, 23:46

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.

Eléphant du PHP | 121 Messages

31 déc. 2007, 01:26

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.

Mammouth du PHP | 1511 Messages

31 déc. 2007, 11:45

Quelqu'un connait t'il un utilitaire pour tout convertir en utf-8 simplement ? :P