8721 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour à tous,
Je recherche un moyen de retrouver dans un tableau listant des mots ceux qui sont accentués pour ajouter leur correspondance non accentuée. Sachant que ces mots ont été recherchés dans une base de données dont la collation est ci_general_utf8. Concrètement voici ce à quoi le code devra ressembler :
<?php
// Le tableau initial récupéré dans la base de données
$tableau = [ "pétété", "patati", "patata", "pêtâtu", "pütèto"];
// Traitement qu'il faudrait faire pour retrouver les mots pétété, pêtâtu et pütèto et de définir leur correspondance non accentuée
// ??????????????
// Ajout des mots petete, petatu et puteto au tableau
$tableau[] = "petete";
$tableau[] = "petatu";
$tableau[] = "puteto";
?>

Il me faudrait donc trouver un moyen d'identifier les mots contenant des lettres accentuées et de créer lur correspondance non accentuée sachant qu'on travaille sur un encodage utf-8...
Merci d'avance Smiley smile
Modifié par jojaba (15 Mar 2018 - 13:15)
Modérateur
Bon je tente de me répondre, dites-moi si je fais fausse route.
Je viens de voir qu'il existe une fonction
array_filter()
http://php.net/manual/fr/function.array-filter.php
qui permet de passer les éléments d'un tableau par une fonction créée par l'utilisateur.
Reste à savoir comment je fais pour retrouver les mots accentués (vérifier la présence de chaque lettre accentués possible comme on peut les voir ici : http://www.pontikis.net/tip/?id=22 ?) et ensuite les "convertir"... ???
Modifié par jojaba (14 Mar 2018 - 16:17)
http://php.net/manual/fr/function.str-replace.php
[ edit ] En fait ton dernier lien répond à ta question. Il te reste plus qu'à boucler sur ton tableau avec un truc dans ce style :


$len = count($array);
for ($i = 0; $i < $len; $i++) {
    $processed = removeAccents($array[$i]);
    if (strcmp($processed, $array[$i]) { $array[] = $processed; }
}

Modifié par GuillaumeBauer (14 Mar 2018 - 18:47)
Meilleure solution
Modérateur
OK, merci pour ta confirmation/aide.
Petite question : ne pourrait-on pas faire le traitement que tu donnes dans la fonction perso utilisée par array_filter() ? cela éviterait de parcourir le tableau...
Je regarde ça et reviens ici pour indiquer un code fonctionnel...
[***edit***]
Ah ben je viens de voir ça sur la page du manuel concernant la fonction array_filter() :
Attention : Si le tableau est modifié depuis la fonction utilisateur (e.g. des éléments sont ajoutés, effacés ou réinitialisés), le comportement de cette fonction est indéfini.
Je vais donc m'abstenir et parcourir le tableau comme tu le proposes (je ne connaissais pas strcmp(), très pratique dans mon cas Smiley cligne )
[***/edit***]
Modifié par jojaba (15 Mar 2018 - 12:56)
Modérateur
Bon ben j'ai pu tester le code ci-dessous sur une page de test en ligne (j'avais jamais essayé de tester du php en ligne, et j'ai pris un service gratuit : http://phptester.net/ )
Voici le code fonctionnel :
<?php
$tableau = [ "pétété", "patati", "patata", "pêtâtu", "pütèto"];
/**
 * Replace accented characters with non accented
 *
 * @param $str
 * @return mixed
 * @link  http://myshadowself.com/coding/php-function-to-convert-accented-characters-to-their-non-accented-equivalant/
 
 */
function removeAccents($str) {
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Œ', 'œ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Š', 'š', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Ÿ', '?', '?', '?', '?', 'Ž', 'ž', '?', 'ƒ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?');
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?');
  return str_replace($a, $b, $str);
}
foreach($tableau as $mot) {
    $processed = removeAccents($mot);
    if (strcmp($processed, $mot)) { $tableau[] = $processed; }
}
var_dump($tableau);

Le résultat :
array(8) { [0]=> string(9) "pétété" [1]=> string(6) "patati" [2]=> string(6) "patata" [3]=> string(8) "pêtâtu" [4]=> string(8) "pütèto" [5]=> string(6) "petete" [6]=> string(6) "petatu" [7]=> string(6) "puteto" } 

Ça semble être bon.
Merci encore et à bientôt Smiley cligne