2011-03-16 1 views
4

J'ai un tableau contenant des mots, dont certains avec des accents. Je veux tester si un mot donné est dans ce tableau, mais en faisant le cas et l'accent insensible. Par exemple:Recherche PHP insensible à un cas et à l'accent dans un tableau

$array = array("coche","camión","moto","carro"); 

je veux une petite fonction simple, quelque chose comme in_array. Si ma chaîne est 'Camion' ou 'camión', elle doit renvoyer true.

Des idées?

Répondre

4

Essayez ceci: :-D

function check_array($array, $string){ 
    $trans = array("é" => "e", "é" => "e", "á" => "a", "á" => "a", "í" => "i","í"=>"i", "ó"=>"o", "ó" => "o", "ú" => "u", "ú"=>"u","ö" => "u", "ü"=>"u"); 
    $realString = strtr($string,$trans); 
    foreach($array as $val){ 
     $realVal = strtr($val,$trans); 
     if(strcasecmp($realVal, $realString) == 0){ 
     return true; 
     } 
    } 
    return false; 
} 

afin de l'utiliser:

check_array($array, 'Camion'); 

utilisant strcasecmp selon Felix Kling suggestion

+0

Je ne crois pas que cela prenne en compte les accents. – Dan

+0

hmmmm vrai; Je dois ajouter ça. quelques minutes – Neal

+0

là nous allons, cela devrait fonctionner. pour changer les accents et tous – Neal

2

Vous devez utiliser iconv avec TRANSLIT

http://php.net/manual/en/function.iconv.php

Mais considérons que iconv TRANSLIT est basé sur SO. Les résultats ne sont donc pas les mêmes d'une machine à l'autre.

Après avoir normalisé les accents que vous pouvez faire un strtolower() ou une recherche avec REGEX/i

1

La façon la plus simple est de mettre en place une table de traduction comme ceci:

$translation = array(
    'from' => array(
     'à','á','â','ã','ä', 'ç', 'è','é','ê','ë', 'ì','í','î','ï', 'ñ', 
     'ò','ó','ô','õ','ö', 'ù','ú','û','ü', 'ý','ÿ', 'À','Á','Â','Ã', 
     'Ä','Ç', 'È','É','Ê','Ë', 'Ì','Í','Î','Ï', 'Ñ', 'Ò','Ó','Ô','Õ', 
     'Ö', 'Ù','Ú','Û','Ü', 'Ý') 
    'to' => array(
     'a','a','a','a','a', 'c', 'e','e','e','e', 'i','i','i','i', 'n', 
     'o','o','o','o','o', 'u','u','u','u', 'y','y', 'A','A','A','A','A', 
     'C','E','E','E','E', 'I','I','I','I', 'N', 'O','O','O','O','O', 
     'U','U','U','U', 'Y') 
); 

et vous peut utiliser strtr pour faire traduire dans l'ordre des octets:

$string = strtr("Camion",$translation['from'],$translation['to']); 

suit qu'il doit tous être dans la gamme anglaise a-z A-Z.

Si votre serveur prend en charge iconv vous pouvez faire quelque chose comme ceci:

$string = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
+0

strtr() s'attend à ce que le paramètre 3 soit une chaîne, tableau donné – user151496

Questions connexes