Функция PHP in_array не распознает диакритический знак - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть код, который запускает файлы и получает все изображения.

$img = '/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/2018_07_DogOwner_VS_CatOwner_655x368_NL-500x281.jpg';
$dir = preg_replace('#[^/]*$#', '', $img); 
$image_files = scandir($dir); 
$image_name = @array_pop(explode('/', $img));
$find = $image_name;
var_dump(in_array($find, $image_files)); 

В этом примере я запускаю только одно изображение.Этот код возвращает истину.Проблема в том, что у меня есть изображение с немецкими знаками (hundezubehör-für-sommer.jpg).

$img = '/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg';

Возвращает false.Есть идеи, почему это не работает?

РЕДАКТИРОВАНИЕ: Я задавал этот вопрос несколько дней назад: Как найти кратчайшее имя (строку) одного и того же изображения с разными именами .Решение этой проблемы здесь: https://3v4l.org/T7lfU. Проблема, которую я думаю, заключается в том, что когда я запускаю код из scandir, то он не может найти диакритический знак.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Проблема заключается в хранении многобайтовых символов, таких как ö и ü, в файле PHP.

Вы можете попробовать интерпретировать строку как многобайтовую:

$img = utf8_encode('/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg');

Кодирование, затем декодирование, чтобы сделать его более безопасным:

$img = html_entity_decode('/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg');

Или обратная косая черта сущностей:

$img = "/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubeh\303\266r-f\303\274r-sommer.jpg";
0 голосов
/ 16 сентября 2018

Функция in_array работает, несмотря на строковый алфавит.У меня проблема возникает из-за того, что ваш PHP-файл и файловая система используют разные кодировки, поэтому значение, считываемое scandir, имеет другую кодировку, поэтому оно отличается от значения $img, записанного в коде.

Попробуйте преобразовать кодировкурезультата scandir, чтобы он соответствовал кодировке файла PHP.Например:

// ...
$image_files = scandir($dir);
foreach ($image_files as &$file) {
    $file = mb_convert_encoding($file, 'UTF-8', 'Windows-1251');
}
// ...
var_dump(in_array($find, $image_files)); 

Замените UTF-8 кодировкой PHP-файла и Windows-1251 кодировкой файловой системы.

...