Remplacer les caractères diacritiques par" équivalent " ASCII en PHP?

questions Connexes:

  1. comment remplacer des caractères dans une chaîne java?
  2. comment remplacer les caractères spéciaux par leur équivalent (comme " á "pour" a") En C#?
<!-Comme dans les questions ci-dessus, je suis à la recherche d'un moyen fiable et robuste pour réduire n'importe quel caractère unicode à un ASCII presque équivalent en utilisant PHP. Je veux vraiment éviter de rouler ma propre table.

par exemple (volé à la 1ère question référencée):Gračišće devient Gracisce

13
demandé sur Community 2010-04-16 19:20:57

4 réponses

iconv module peut le faire, plus spécifiquement, le iconv () fonction:

$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce");
echo $str;
//outputs "Gracisce"

le principal problème avec iconv est que vous avez juste à regarder vos encodages, mais c'est certainement le bon outil pour le travail (j'ai utilisé 'Windows-1252' pour l'exemple en raison des limites de l'éditeur de texte avec lequel je travaillais ;) la fonctionnalité d'iconv que vous voulez certainement utiliser est le //TRANSLIT flag, qui dit à iconv de transliter tout caractère qui ne avoir une correspondance ASCII dans l'approximation la plus proche.

31
répondu zombat 2010-04-16 15:30:06

ma solution est de créer deux chaînes - d'abord avec des lettres non désirées et ensuite avec des lettres qui remplaceront les premières.

$from = 'čšć';
$to   = 'csc';
$text = 'Gračišće';

$result = str_replace(str_split($from), str_split($to), $text);
2
répondu hsz 2010-04-16 15:28:49

le problème avec sa réponse était que je recevais:

Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in D:\www\phpcommand.php(11) : eval()'d code on line 3

et après avoir enlevé //IGNORE dans la fonction, j'ai:

Gr'a'e~a~o^O"ucisce

Donc,š personnage a été correctement traduits, mais les autres personnages ne sont pas.

La solution qui a fonctionné pour moi est un mélange entre preg_replace (pour éliminer tout mais [a-zA-Z0-9] - y compris les espaces) et @zombat de l' solution:

preg_replace('/[^a-zA-Z0-9.]/','',iconv('UTF-8', 'ASCII//TRANSLIT', "GráéãõÔücišce"));

Sortie:

GraeaoOucisce
2
répondu dmmd 2013-11-04 12:25:42

essaye ceci:

function normal_chars($string)
{
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '', $string);
    $string = preg_replace(array('~[^0-9a-z]~i', '~-+~'), ' ', $string);
    return trim($string);
}

Examples:

echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA

basé sur la réponse sélectionnée dans ce thread: URL Friendly Username in PHP?

1
répondu John Conde 2017-05-23 11:48:23