Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

понедельник, 6 сентября 2010 г.

PHP. basename и pathinfo с кодировкой UTF.

Такие функции как basename, pathinfo в PHP не работают с именами файлов в кодировке UTF и это очень фигово, если не использовать такую функцию:

function pathinfo_utf($path) {

    if (strpos($path, '/') !== false) 
        $basename = end(explode('/', $path));
    elseif (strpos($path, '\\') !== false)
        $basename = end(explode('\\', $path));
    else 
        return false;

    if (!$basename)
        return false;

    $dirname = substr($path, 0,
                   strlen($path) - strlen($basename) - 1);

    if (strpos($basename, '.') !== false) {
        $extension = end(explode('.', $path));
        $filename = substr($basename, 0,
                        strlen($basename) - strlen($extension) - 1);
    } else {
        $extension = '';
        $filename = $basename;
    }

    return array (
            'dirname' => $dirname,
            'basename' => $basename,
            'extension' => $extension,
            'filename' => $filename
    );
}

Спасибо jjoss at mail dot ru, который опубликовал ее на php.net, кажется она работает ;-)

2 комментария:

  1. То что нужно. Только проблема в том, что нужно еще basename

    ОтветитьУдалить
  2. Мне функция не понравилась, написал свою
    function full_pathinfo($path_file){
    $path_file = strtr($path_file,array('\\'=>'/'));

    preg_match("~[^/]+$~",$path_file,$file);
    preg_match("~([^/]+)[.$]+(.*)~",$path_file,$file_ext);
    preg_match("~(.*)[/$]+~",$path_file,$dirname);

    return array('dirname' => $dirname[1],
    'basename' => $file[0],
    'extension' => (isset($file_ext[2]))?$file_ext[2]:false,
    'filename' => (isset($file_ext[1]))?$file_ext[1]:$file[0]);
    }
    5000 вызовов за 0.3863 с
    конечно не так быстро как pathinfo 0.0283 с

    ОтветитьУдалить