pathinfo_extension - php get file name
Hacer que PHP pathinfo() devuelva el nombre de archivo correcto si el nombre de archivo es UTF-8 (6)
Consulte " pathinfo () no puede manejar argumentos con caracteres especiales como el alemán ''Umlaute'' ".
Cuando se utiliza la función pathinfo()
PHP en un nombre de archivo conocido como UTF-8, no devuelve el valor correcto, a menos que haya caracteres "normales" delante del carácter especial.
Ejemplos:
pathinfo(''aä.pdf'')
devuelve:
Array
(
[dirname] => [the dir]
[basename] => aä.pdf
[extension] => pdf
[filename] => aä
)
que es fino y elegante, pero pathinfo(''äa.pdf'')
devuelve:
Array
(
[dirname] => [the dir]
[basename] => a.pdf
[extension] => pdf
[filename] => a
)
Que no es exactamente lo que esperaba. Peor aún, pathinfo(''ä.pdf'')
devuelve:
Array
(
[dirname] => [the dir]
[basename] => .pdf
[extension] => pdf
[filename] =>
)
¿Por qué hace esto? Esto va para todos los personajes acentuados que he probado.
Cuando se procesan caracteres ansi, la función pathinfo lo hace correctamente.
Base esta nota, convertiremos (codificar) la entrada a caracteres de caracteres y luego usaremos la función pathinfo para mantener todo esto.
Finalmente, convertiremos (decodificando) los valores de salida al formato original.
Y la demostración como bramando.
function _pathinfo($path, $options = null)
{
$path = urlencode($path);
$parts = null === $options ? pathinfo($path) : pathinfo($path, $options);
foreach ($parts as $field => $value) {
$parts[$field] = urldecode($value);
}
return $parts;
}
// calling
_pathinfo(''すtest.jpg'');
_pathinfo(''すtest.jpg'', PATHINFO_EXTENSION);
He usado estas funciones en PHP 5.3.3 - 5.3.18 para manejar el problema de UTF-8 en basename () y pathinfo ().
if (!function_exists("mb_basename")) { function mb_basename($path) { $separator = " qq "; $path = preg_replace("/[^ ]/u", $separator."/$0".$separator, $path); $base = basename($path); $base = str_replace($separator, "", $base); return $base; } }
if (!function_exists("mb_pathinfo")) { function mb_pathinfo($path, $opt = "") { $separator = " qq "; $path = preg_replace("/[^ ]/u", $separator."/$0".$separator, $path); if ($opt == "") $pathinfo = pathinfo($path); else $pathinfo = pathinfo($path, $opt); if (is_array($pathinfo)) { $pathinfo2 = $pathinfo; foreach($pathinfo2 as $key => $val) { $pathinfo[$key] = str_replace($separator, "", $val); } } else if (is_string($pathinfo)) $pathinfo = str_replace($separator, "", $pathinfo); return $pathinfo; } }
Una solución temporal para este problema parece ser asegurarse de que haya un carácter "normal" delante de los caracteres acentuados, como por ejemplo:
function getFilename($path)
{
// if there''s no ''/'', we''re probably dealing with just a filename
// so just put an ''a'' in front of it
if (strpos($path, ''/'') === false)
{
$path_parts = pathinfo(''a''.$path);
}
else
{
$path= str_replace(''/'', ''/a'', $path);
$path_parts = pathinfo($path);
}
return substr($path_parts["filename"],1);
}
Tenga en cuenta que reemplazamos todas las apariciones de ''/'' con ''/ a'', pero esto está bien, ya que volvemos a partir del desplazamiento 1 del resultado. Curiosamente, la parte dirname
de pathinfo()
parece funcionar, por lo que no se necesita una solución alternativa allí.
antes de usar pathinfo
setlocale(LC_ALL,''en_US.UTF-8'');
pathinfo($OriginalName, PATHINFO_FILENAME);
pathinfo($OriginalName, PATHINFO_BASENAME);
private function _pathinfo($path, $options = null) {
$result = pathinfo('' '' . $path, $options);
return substr($result, 1);
}