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
fuente
fuente
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Esto también se encarga de.file
los archivos (Unix ocultos, creo). Eso es si quieres mantenerlo como una línea, lo cual es un poco desordenado para mi gusto.Mantenlo simple :)
Editar:
Esta es otra solución no regex que creo que es más eficiente:
Hay algunos casos de esquina que se manejan mejor con la respuesta de VisioN a continuación, particularmente los archivos sin extensión (
.htaccess
etc. incluidos).Es muy eficaz y maneja los casos de esquina de una manera posiblemente mejor al regresar en
""
lugar de la cadena completa cuando no hay punto o cadena antes del punto. Es una solución muy bien diseñada, aunque difícil de leer. Péguelo en su lib de ayuda y simplemente úselo.Edición antigua:
Una implementación más segura si vas a encontrar archivos sin extensión, o archivos ocultos sin extensión (ver el comentario de VisioN a la respuesta de Tom más arriba) sería algo similar.
Si
a.length
es uno, es un archivo visible sin extensión, es decir. archivoSi
a[0] === ""
ya.length === 2
es un archivo oculto sin extensión, es decir. .htaccessEspero que esto ayude a aclarar los problemas con los casos un poco más complejos. En términos de rendimiento, creo que esta solución es un poco más lenta que la expresión regular en la mayoría de los navegadores. Sin embargo, para los propósitos más comunes, este código debe ser perfectamente utilizable.
fuente
filename
realidad no tiene una extensión? ¿No devolvería esto simplemente el nombre de archivo base, que sería algo malo?La siguiente solución es lo suficientemente rápida y corta como para usarla en operaciones masivas y guardar bytes adicionales:
Aquí hay otra solución universal no regexp de una línea:
Ambos funcionan correctamente con nombres que no tienen extensión (por ejemplo, myfile ) o que comienzan con
.
punto (por ejemplo, .htaccess ):Si le importa la velocidad, puede ejecutar el punto de referencia y verificar que las soluciones proporcionadas sean las más rápidas, mientras que la breve es tremendamente rápida:
Cómo funciona el corto:
String.lastIndexOf
El método devuelve la última posición de la subcadena (es decir"."
) en la cadena dada (es decirfname
). Si no se encuentra la subcadena, el método devuelve-1
.-1
y0
, que se refieren respectivamente a nombres sin extensión (por ejemplo"name"
) y a nombres que comienzan con punto (por ejemplo".htaccess"
).>>>
) si se utiliza con cero afecta a números negativos transformar-1
a4294967295
y-2
a4294967294
, que es útil para el nombre de archivo restante sin cambios en los casos de borde (una especie de truco aquí).String.prototype.slice
extrae la parte del nombre de archivo de la posición que se calculó como se describe. Si el número de posición es mayor que la longitud del método de cadena devuelve""
.Si desea una solución más clara que funcione de la misma manera (además con soporte adicional de ruta completa), consulte la siguiente versión extendida. Esta solución será más lenta que las frases anteriores pero es mucho más fácil de entender.
Las tres variantes deberían funcionar en cualquier navegador web en el lado del cliente y también se pueden usar en el código NodeJS del lado del servidor.
fuente
Probado con
también
fuente
fuente
fuente
fuente
fuente
Código
Prueba
Tenga en cuenta que, en ausencia de una consulta, el fragmento aún podría estar presente.
JSLint
0 advertencias.
fuente
Rápido y funciona correctamente con caminos
Algunos casos extremos
Las soluciones que usan división son lentas y las soluciones con lastIndexOf no manejan casos extremos.
fuente
.exec()
. Su código será mejor como(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.Sólo quería compartir esto.
aunque esto tiene una desventaja de que los archivos sin extensión devolverán la última cadena. pero si lo haces, esto solucionará todo:
fuente
slice
método se refiere a matrices en lugar de cadenas. Para cuerdassubstr
osubstring
funcionará.String.prototype.slice
y,Array.prototype.slice
por lo tanto, funciona de una manera un tanto métodoEstoy seguro de que alguien puede minimizar y / u optimizar mi código en el futuro. Pero, en este momento , estoy 200% seguro de que mi código funciona en cada situación única (por ejemplo, solo con el nombre del archivo , con URL relativas , relativas a raíz y absolutas , con etiquetas de fragmentos
#
, con cadenas de consulta?
, y lo que sea de lo contrario, puede decidir lanzarle), sin problemas, y con precisión de punta.Para pruebas, visite: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Aquí está el JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
No ser demasiado confiado, o soplar mi propia trompeta, pero no he visto ningún bloque de código para esta tarea (la búsqueda de la 'correcta' extensión de archivo, en medio de una batería de diferentes
function
argumentos de entrada) que funciona tan bien como lo hace este.Nota: Por diseño, si no existe una extensión de archivo para la cadena de entrada dada, simplemente devuelve una cadena en blanco
""
, no un error ni un mensaje de error.Nota (2): Si le gusta mi código, asegúrese de agregarlo a su biblioteca js y / o repositorios, porque trabajé duro para perfeccionarlo, y sería una pena desperdiciarlo. Así que sin más preámbulos, aquí está:
¡Disfrutar! ¡Eres muy bienvenido!:
fuente
fuente
Si está tratando con URL web, puede usar:
Demostración: https://jsfiddle.net/squadjot/q5ard4fj/
fuente
Prueba esto:
fuente
editar: Extrañamente (o tal vez no) el
$1
segundo argumento del método de reemplazo no parece funcionar ... Lo siento.fuente
Me acabo de dar cuenta de que no es suficiente hacer un comentario sobre la respuesta de p4bl0, aunque la respuesta de Tom claramente resuelve el problema:
fuente
Para la mayoría de las aplicaciones, un script simple como
funcionaría bien (según lo provisto por Tom). Sin embargo, esto no es infalible. No funciona si se proporciona el siguiente nombre de archivo:
Puede ser un poco exagerado, pero sugeriría usar un analizador de URL como este para evitar fallas debido a nombres de archivo impredecibles.
Usando esa función en particular, podría obtener el nombre del archivo de esta manera:
Esto generará "image.jpg" sin los url vars. Entonces eres libre de agarrar la extensión del archivo.
fuente
fuente
//uso
extensión ('file.jpeg')
siempre devuelve la extensión minúscula para que pueda verificarla en el cambio de campo funciona para:
file.JpEg
archivo (sin extensión)
archivo. (sin extensión)
fuente
Si está buscando una extensión específica y conoce su longitud, puede usar substr :
Referencia de JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
fuente
Llego muchas lunas tarde a la fiesta, pero por simplicidad uso algo como esto
fuente
Hay una función de biblioteca estándar para esto en el
path
módulo:Salida:
Entonces, si solo quieres el formato:
Si no hay extensión, la función devolverá una cadena vacía:
Si está utilizando Node, entonces
path
está integrado. Si está apuntando al navegador, Webpack incluirá unapath
implementación para usted. Si está apuntando al navegador sin Webpack, entonces puede incluir path-browserify manualmente.No hay razón para dividir cadenas o expresiones regulares.
fuente
"one-liner" para obtener el nombre de archivo y la extensión usando
reduce
y la desestructuración de la matriz :con mejor sangría:
fuente
Una solución de una línea que también tendrá en cuenta los parámetros de consulta y los caracteres en la URL.
fuente
page.html#fragment
), esto devolverá la extensión del archivo y el fragmento.Esta solución simple
Pruebas
fuente
La respuesta de Wallacer es buena, pero se necesita una comprobación más.
Si el archivo no tiene extensión, usará el nombre del archivo como extensión, lo que no es bueno.
Prueba este:
fuente
No olvide que algunos archivos no pueden tener extensión, por lo tanto:
fuente
fuente
fuente