[PHP] Suppression d'accents, de TOUS les accents

Suppression d'accents, de TOUS les accents [PHP] - PHP - Programmation

Marsh Posté le 24-03-2018 à 07:45:26    

Hello,  
 
Cela ressemble à une question déjà tombée 1000x. Elle va un peu plus loin toutefois.  
 
Pour échapper certains accents (et les transformer en ce même caractère non accentué), j'utilise depuis des années une fonction faite main :  
 

Code :
  1. function no_accent($str_accent) {
  2.    $pattern = Array("/æ/", "/É/", "/é/", "/è/", "/ê/", "/ë/", "/€/", "/ç/", "/Ç/", "/à/", "/á/", "/â/", "/ä/", "/ã/", "/Ä/", "/À/", "/å/", "/Â/", "/î/", "/ï/", "/í/", "/ì/", "/$/", "/µ/", "/ù/", "/ü/", "/û/", "/ú/", "/Ó/", "/ô/", "/ö/", "/õ/", "/ø/", "/Ø/", "/ò/","/ó/", "/ð/", "/ý/", "/ÿ/", "/ž/", "/’/" );
  3.  $rep_pat = Array("ae", "e", "e", "e", "e", "e", "e", "c", "C", "a", "a", "a", "a", "a", "a", "a", "a", "a", "i", "i", "i", "i", "", "u", "u", "u", "u", "u", "o", "o", "o", "o", "o", "o", "o", "o", "d", "y", "y", "z","" );
  4.    $str_noacc = preg_replace($pattern, $rep_pat, $str_accent);
  5.    return $str_noacc;
  6. }


 
 
Le problème c'est qu'on utilise parfois des termes d'autres alphabets et je dois à chaque fois adapter cette liste et corriger manuellement le problème.  
 
J'ai donc trouvé une fonction un peu plus complète :  
 

Code :
  1. function no_accentNEW($text) {
  2.         $utf8 = array(
  3.             '/[áàâãªäåæ]/u' => 'a',
  4.             '/[ÁÀÂÃÄÅÆ]/u' => 'A',
  5.             '/[éèêë]/u' => 'e',
  6.             '/[ÉÈÊË]/u' => 'E',
  7.             '/[ÍÌÎÏÍ]/u' => 'I',
  8.             '/[íìîï]/u' => 'i',
  9.             '/[óòôõºöðø]/u' => 'o',
  10.             '/[ÓÒÔÕÖØ]/u' => 'O',
  11.             '/[úùûü]/u' => 'u',
  12.             '/[ÚÙÛÜ]/u' => 'U',
  13.             '/[ýýÿ]/u' => 'y',
  14.             '/Š/u' => 'S',
  15.             '/š/u' => 's',
  16.             '/ç/' => 'c',
  17.             '/Ç/' => 'C',
  18.             '/Ð/' => 'Dj',
  19.             '/ñ/' => 'n',
  20.             '/Ñ/' => 'N',
  21.             '/Ý/' => 'Y',
  22.             '/Ž/' => 'Z',
  23.             '/ž/' => 'z',
  24.             '/þ/' => 'b',
  25.             '/Þ/' => 'B',
  26.             '/ƒ/' => 'f',
  27.             '/ß/' => 'ss',
  28.             '/Œ/' => 'Oe',
  29.             '/œ/' => 'oe',
  30.             '/–/' => '-', // conversion d'un tiret UTF-8 en un tiret simple
  31.             '/[‘’‚‹›]/u' => ' ', // guillemet simple
  32.             '/[“”«»„]/u' => ' ', // guillemet double
  33.             '/ /' => ' ', // espace insécable (équiv. à 0x160)
  34.         );
  35.         $text = preg_replace(array_keys($utf8), array_values($utf8), $text);
  36.         return $text;
  37.     }


 
Le seul souci est qu'on ne comprend pas non plus TOUS les accents et caractères spéciaux. Je prends l'exemple de bizarrerie comme Ġ Ř Ĉ etc. Il y en a des centaines comme ça, reprises ici : https://www.jchr.be/html/caracteres.htm  
 
Mon plan A serait évidemment de refaire une fonction manuellement qui reprendrait tous ces foutus caractères, mais je me demandais évidemment, par gain de temps, si l'un d'entre vous serait éventuellement déjà tombé sur une fonction similaire ?  
 
Merci et bonne journée !


Message édité par Dawa le 24-03-2018 à 07:50:07

---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 24-03-2018 à 07:45:26   

Reply

Marsh Posté le 24-03-2018 à 10:15:33    

Salut,

 

Non, mais j'ai envie de poser la question de si tu ne prends pas le problème à l'envers ?
Quel est l'intérêt de remplacer ces caractères ? Et si tu n'en veux vraiment pas, pourquoi ne pas les interdire ?
Non parce que se retrouver avec un "poincon" au lieu d'un "poinçon" ou un "ou" au lieu d'un "où" ça n'a pas de sens.


Message édité par MaybeEijOrNot le 24-03-2018 à 13:58:41

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 24-03-2018 à 13:05:16    

D'accord avec MaybeEijOrNot, toutefois si tu dois vraiment supprimer ces caractères, et ainsi te limiter à l'ASCII, tu peux utiliser les méthodes précisées dans ce post par exemple, via des regex donc : https://stackoverflow.com/questions [...] rom-string


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 24-03-2018 à 17:04:26    

Si c'est bien de l'UTF-8, il manque moitié des modificateurs u.
 
Et puis, dans ce cas, le top pour faire une translitération, c'est l'extension intl puisque le faire à la main à coup de str_replace ou preg_replace, c'est sûr que tu es loin de gérer Unicode, sans parler, en plus, des caractères décomposés (ex : le é peut aussi s'écrire e suivi de l'accent grave séparé) ...
 

Code :
  1. function no_accent(string $string): string {
  2.    return transliterator_create('NFD; [:Nonspacing Mark:] Remove; NFC')->transliterate($string);
  3. }


 
Voire :

Code :
  1. function no_accent(string $string): string {
  2.    return transliterator_create_from_rules("::Latin; ::Lower; ::Latin-ASCII; ([^a-z0-9])+ > \-" )->transliterate($string);
  3. }


Message édité par pluj le 24-03-2018 à 17:06:43
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed