Skip to content

Instantly share code, notes, and snippets.

@ivanrosolen
Last active December 30, 2015 07:39
Show Gist options
  • Save ivanrosolen/7797439 to your computer and use it in GitHub Desktop.
Save ivanrosolen/7797439 to your computer and use it in GitHub Desktop.
Criar um jeito em php para retornar apenas o nome do arquivo (sem extensão nem diretórios)
/var/www/public/upload/image.jpeg
imagem.01.png
/ivan.pdf
/var/www/public/upload/imaginação.JPG
/var/www/nome bem legal.png
ilári iê.gif
/opa_ivan.01_03.jpeg
swp.ivan.01.12.2013.php
/var/www/_windows Like.gif
yudi.jPeG
Não vale usar o pathinfo($filename, PATHINFO_FILENAME ); porque, teoricamente, é o jeito correto.
@fibbarth
Copy link

fibbarth commented Dec 5, 2013

Pegando nome de arquivos ocultos também.

https://gist.github.com/fibbarth/7799095

$cases = array(
'/var/www/public/upload/image.jpeg',
'imagem.01.png',
'/ivan.pdf',
'/var/www/public/upload/imaginação.JPG',
'/var/www/nome bem legal.png',
'ilári iê.gif',
'/opa_ivan.01_03.jpeg',
'swp.ivan.01.12.2013.php',
'/var/www/_windows Like.gif',
'yudi.jPeG',
'.htaccess',
'/var/www/.htpasswd',
'/~teste.php' );

foreach( $cases as $case ){
echo 'PATHINFO:'.pathinfo($case, PATHINFO_FILENAME )."
";
echo 'getFileName:'.getFileName( $case )."
";
}
function getFileName( $string ){
$filename = trim(array_pop(explode(DIRECTORY_SEPARATOR, $string)),'.');
if( strpos($filename,'.') === false ){
return $filename;
}
return substr($filename,0,strrpos($filename,'.'));
}

@lleitep3
Copy link

lleitep3 commented Dec 5, 2013

$arr = [
    '/var/www/public/upload/image.jpeg',
    'imagem.01.png',
    '/ivan.pdf',
    '/var/www/public/upload/imaginação.JPG',
    '/var/www/nome bem legal.png',
    'ilári iê.gif',
    '/opa_ivan.01_03.jpeg',
    'swp.ivan.01.12.2013.php',
    '/var/www/_windows Like.gif',
    'yudi.jPeG'
];

foreach ($arr as $f) {
    preg_match('(([^\/]+)\.\w+$)', $f, $s); echo $s[1].'<br/>'; // hahaha
}

@ramcoelho
Copy link

Galera esqueceu do basename:

<?php

function getName($path)
{
    return preg_replace('/\.[^.]*$/', '', basename($path));
}

Se preferir considerar .htaccess e .htpasswd como nomes de arquivos, ao invés de extensões, pode usar esta:

<?php

function getName($path)
{
    return preg_replace('/^([^.].*)\.[^.]*$/', '${1}', basename($path));
}

E se quiser parametrizar:

<?php

function getName($path, $show_dotted_no_ext = false)
{
    $regex = ($show_dotted_no_ext?'/^([^.].*)\.[^.]*$/':'/()\.[^.]*$/');
    return preg_replace($regex, '${1}', basename($path));
}

E uma alternativa sem regex, usando somente o basename com o parâmetro suffix:

<?php

function getName($path)
{
    $parts = explode('.', $path);
    return basename($path, '.' . array_pop($parts));
}

@fibbarth
Copy link

fibbarth commented Dec 5, 2013

Ricardo, não é que galera esqueceu do basename, é que a questão proposta pelo Ivan seria "criar uma jeito", ao invés de ir para os meios mais tradicionais, por isso talvez o pessoal está seguinte para uma forma, vamos dizer assim, "mais alternativa" de resolver.

@ramcoelho
Copy link

Bom, se é esta a proposta, segue uma só com regex, então:

<?php

function getName($path)
{
    return preg_replace('/^.*\/(.*)\..*$/', '${1}', "/${path}");
}

@ivanrosolen
Copy link
Author

Pensa fora da caixa povo

<?php

foreach ($arr as $filename) {

    $ivan = end(explode('/',$filename));

    echo strstr($ivan, strrchr($ivan,'.'), true).'<br />';

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment