Ver código:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
javascript
file-extension
Sergio del Amo
fonte
fonte
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Isso também cuida dos.file
tipos de arquivos (Unix oculto, acredito). Isto é, se você quiser mantê-lo como uma só linha, o que é um pouco confuso para o meu gosto.Mantenha simples :)
Editar:
Esta é outra solução não-regex que acredito ser mais eficiente:
Existem alguns casos de canto que são mais bem tratados pela resposta do VisioN abaixo, particularmente arquivos sem extensão (
.htaccess
etc incluídos).É muito eficiente e lida com casos de canto de uma maneira discutivelmente melhor retornando em
""
vez da sequência completa quando não há ponto ou sequência antes do ponto. É uma solução muito bem trabalhada, embora difícil de ler. Coloque-o na sua biblioteca de ajudantes e use-a.Edição antiga:
Uma implementação mais segura se você for encontrar arquivos sem extensão ou arquivos ocultos sem extensão (consulte o comentário do VisioN à resposta de Tom acima) seria algo nesse sentido
Se
a.length
for um, é um arquivo visível sem extensão, ou seja. ArquivoSe
a[0] === ""
ea.length === 2
é um arquivo oculto sem extensão ou seja. .htaccessEspero que isso ajude a esclarecer problemas com os casos um pouco mais complexos. Em termos de desempenho, acredito que esta solução é um pouco mais lenta que o regex na maioria dos navegadores. No entanto, para fins mais comuns, esse código deve ser perfeitamente utilizável.
fonte
filename
realmente não tiver uma extensão? Isso simplesmente não retornaria o nome do arquivo base, o que seria meio ruim?A solução a seguir é rápida e curta o suficiente para usar em operações em massa e salvar bytes extras:
Aqui está outra solução universal não-regexp de uma linha:
Ambos funcionam corretamente com nomes sem extensão (por exemplo, meu arquivo ) ou começando com
.
ponto (por exemplo, .htaccess ):Se você se preocupa com a velocidade, pode executar o benchmark e verificar se as soluções fornecidas são as mais rápidas, enquanto as menores são tremendamente rápidas:
Como o curto funciona:
String.lastIndexOf
O método retorna a última posição da substring (ie"."
) na string especificada (iefname
). Se a substring não for encontrada, o método retornará-1
.-1
e0
, que se referem respectivamente a nomes sem extensão (por exemplo"name"
) e a nomes que começam com ponto (por exemplo".htaccess"
).>>>
) se usado com zero afeta números negativos que se transformam-1
em4294967295
e-2
para4294967294
, o que é útil para manter o nome do arquivo inalterado nos casos de borda (tipo de truque aqui).String.prototype.slice
extrai a parte do nome do arquivo da posição que foi calculada conforme descrito. Se o número da posição for maior que o comprimento do método string, retornará""
.Se você deseja uma solução mais clara que funcione da mesma maneira (além de suporte extra de caminho completo), verifique a seguinte versão estendida. Essa solução será mais lenta que as one-liners anteriores, mas é muito mais fácil de entender.
Todas as três variantes devem funcionar em qualquer navegador da Web no lado do cliente e também podem ser usadas no código NodeJS do servidor.
fonte
Testado com
Além disso
fonte
fonte
fonte
fonte
fonte
Código
Teste
Observe que, na ausência de uma consulta, o fragmento ainda pode estar presente.
JSLint
0 avisos.
fonte
Rápido e funciona corretamente com caminhos
Alguns casos extremos
As soluções usando split são lentas e as soluções com lastIndexOf não lidam com casos extremos.
fonte
.exec()
. Seu código será melhor como(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.Eu só queria compartilhar isso.
embora isso ocorra, os arquivos sem extensão retornarão a última string. mas se você fizer isso, isso corrigirá tudo:
fonte
slice
método refere-se a matrizes e não a strings. Para cordassubstr
ousubstring
vai funcionar.String.prototype.slice
e também umArray.prototype.slice
para que ele meio que ambas as maneiras de trabalho meio de métodoTenho certeza de que alguém pode, e irá, minificar e / ou otimizar meu código no futuro. Mas, no momento , tenho 200% de certeza de que meu código funciona em todas as situações únicas (por exemplo, apenas com o nome do arquivo , com URLs relativas , relativas à raiz e absolutas , com tags de fragmento
#
, com strings de consulta?
e o que for caso contrário, você pode optar por jogá-lo), sem falhas e com precisão.Para prova, visite: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Aqui está o JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
Para não ficar confiante demais, ou tocar meu próprio trompete, mas não vi nenhum bloco de código para esta tarefa (encontrar a extensão de arquivo 'correta' , em meio a uma bateria de
function
argumentos de entrada diferentes ) que funciona tão bem quanto isso.Nota: Por padrão, se uma extensão de arquivo não existir para a sequência de entrada especificada, ela simplesmente retorna uma sequência em branco
""
, não um erro nem uma mensagem de erro.Nota (2): Se você gosta do meu código, adicione-o às bibliotecas js e / ou repo, porque trabalhei duro para aperfeiçoá-lo e seria uma pena desperdiçar. Então, sem mais delongas, aqui está:
Aproveitar! Você é muito bem-vindo!:
fonte
fonte
Se você estiver lidando com URLs da Web, poderá usar:
Demonstração: https://jsfiddle.net/squadjot/q5ard4fj/
fonte
Tente o seguinte:
fonte
edit: Estranhamente (ou talvez não seja)
$1
, o segundo argumento do método de substituição não parece funcionar ... Desculpe.fonte
Acabei de perceber que não basta comentar a resposta de p4bl0, embora a resposta de Tom resolva claramente o problema:
fonte
Para a maioria dos aplicativos, um script simples como
funcionaria muito bem (conforme fornecido por Tom). No entanto, isso não é à prova de idiotas. Não funciona se o seguinte nome de arquivo for fornecido:
Pode ser um pouco exagerado, mas eu sugiro o uso de um analisador de URL como este para evitar falhas devido a nomes de arquivos imprevisíveis.
Usando essa função específica, você pode obter o nome do arquivo assim:
Isso produzirá "image.jpg" sem os url vars. Então você está livre para pegar a extensão do arquivo.
fonte
fonte
//uso
extensão ('file.jpeg')
sempre retorna a extensão inferior da extensão para que você possa verificá-la nas alterações de campo para:
file.JpEg
arquivo (sem extensão)
Arquivo. (sem extensão)
fonte
Se você está procurando uma extensão específica e conhece seu comprimento, pode usar substr :
Referência do JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
fonte
Estou muitas luas atrasado para a festa, mas por simplicidade eu uso algo assim
fonte
Há uma função de biblioteca padrão para isso no
path
módulo:Resultado:
Então, se você deseja apenas o formato:
Se não houver extensão, a função retornará uma string vazia:
Se você estiver usando o Node, então
path
está embutido. Se você estiver direcionando o navegador, o Webpack incluirá umapath
implementação para você. Se você estiver direcionando o navegador sem o Webpack, poderá incluir o path-browserify manualmente.Não há razão para fazer divisão de sequência ou regex.
fonte
"one-liner" para obter o nome do arquivo e a extensão usando
reduce
e destruindo a matriz :com melhor indentação:
fonte
Uma solução de uma linha que também considerará parâmetros de consulta e quaisquer caracteres no URL.
fonte
page.html#fragment
), isso retornará a extensão do arquivo e o fragmento.Esta solução simples
Testes
fonte
A resposta do Wallacer é boa, mas é necessária mais uma verificação.
Se o arquivo não tiver extensão, ele usará o nome do arquivo como extensão, o que não é bom.
Tente este:
fonte
Não esqueça que alguns arquivos não podem ter extensão, portanto:
fonte
fonte
fonte