PHP нечувствительный к регистру и акценту поиск в массиве - PullRequest
4 голосов
/ 16 марта 2011

У меня есть массив, содержащий слова, некоторые из них с акцентами. Я хочу проверить, входит ли данное слово в этот массив, но делая его нечувствительным к регистру и акценту. Например:

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

Я хочу простую маленькую функцию, что-то вроде in_array. Если моя строка 'Camion' или 'camión', она должна вернуть true.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 16 марта 2011

Попробуйте это:: -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;
}

, чтобы использовать его:

check_array($array, 'Camion');

с использованием strcasecmp согласно Феликс Клинг предложение

2 голосов
/ 16 марта 2011

Вы должны использовать iconv с TRANSLIT

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

Но учтите, что iconv TRANSLIT основан на ТАК. Так что результаты от машины к машине не одинаковы.

После нормализации акцентов вы можете выполнить strtolower () или выполнить поиск с помощью REGEX / i

1 голос
/ 16 марта 2011

Самый простой способ - настроить таблицу перевода следующим образом:

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

, а затем вы можете использовать strtr для выполнения перевода в байтовом порядке:

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

после этого все должно быть в английском диапазоне a-z A-Z.

Если ваш сервер поддерживает iconv, вы можете сделать что-то вроде этого:

$string = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string);
0 голосов
/ 16 марта 2011

См. Сопоставление нечувствительной к ударению подстроки для аналогичного вопроса и некоторые идеи о том, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...