estoy seguro de que alguien pueda, y lo hará, Minify y/u optimizar mi código en el futuro. Pero, a partir de ahora, estoy 200% seguro de que mi código funciona en cada situación única (por ejemplo, con sólo el nombre archivo sólo, con relativa, relativa a la raíz y absoluta URL, con fragmento#
etiquetas, con consulta?
cadenas, y cualquier otra cosa que decida tirar), sin problemas, y con precisión de punto de pin.
Como prueba, visite: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Aquí está la jsFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
No ser demasiado confiado, o soplar mi propia trompeta, pero no he visto cualquier bloque de código para esta tarea (encontrar la extensión de archivo 'correcta', en medio de una batería de diferentes argumentos de entrada function
) que funciona tan bien como esto.
Nota: Por diseño, si una extensión de archivo no existe para la cadena de entrada dada, simplemente devuelve una cadena en blanco ""
, no es un error, ni un mensaje de error.
Se necesitan dos argumentos:
Nota (2) "": Si te gusta mi código, asegúrese de añadirlo a su js biblioteca, y/o cesión temporal de, porque trabajé duro en perfeccionarlo, y sería una pena desperdiciarlo.Entonces, sin más preámbulos, aquí está:
function getFileExtension(fileNameOrURL, showUnixDotFiles)
{
/* First, let's declare some preliminary variables we'll need later on. */
var fileName;
var fileExt;
/* Now we'll create a hidden anchor ('a') element (Note: No need to append this element to the document). */
var hiddenLink = document.createElement('a');
/* Just for fun, we'll add a CSS attribute of [ style.display = "none" ]. Remember: You can never be too sure! */
hiddenLink.style.display = "none";
/* Set the 'href' attribute of the hidden link we just created, to the 'fileNameOrURL' argument received by this function. */
hiddenLink.setAttribute('href', fileNameOrURL);
/* Now, let's take advantage of the browser's built-in parser, to remove elements from the original 'fileNameOrURL' argument received by this function, without actually modifying our newly created hidden 'anchor' element.*/
fileNameOrURL = fileNameOrURL.replace(hiddenLink.protocol, ""); /* First, let's strip out the protocol, if there is one. */
fileNameOrURL = fileNameOrURL.replace(hiddenLink.hostname, ""); /* Now, we'll strip out the host-name (i.e. domain-name) if there is one. */
fileNameOrURL = fileNameOrURL.replace(":" + hiddenLink.port, ""); /* Now finally, we'll strip out the port number, if there is one (Kinda overkill though ;-)). */
/* Now, we're ready to finish processing the 'fileNameOrURL' variable by removing unnecessary parts, to isolate the file name. */
/* Operations for working with [relative, root-relative, and absolute] URL's ONLY [BEGIN] */
/* Break the possible URL at the [ '?' ] and take first part, to shave of the entire query string (everything after the '?'), if it exist. */
fileNameOrURL = fileNameOrURL.split('?')[0];
/* Sometimes URL's don't have query's, but DO have a fragment [ # ](i.e 'reference anchor'), so we should also do the same for the fragment tag [ # ]. */
fileNameOrURL = fileNameOrURL.split('#')[0];
/* Now that we have just the URL 'ALONE', Let's remove everything to the last slash in URL, to isolate the file name. */
fileNameOrURL = fileNameOrURL.substr(1 + fileNameOrURL.lastIndexOf("/"));
/* Operations for working with [relative, root-relative, and absolute] URL's ONLY [END] */
/* Now, 'fileNameOrURL' should just be 'fileName' */
fileName = fileNameOrURL;
/* Now, we check if we should show UNIX dot-files, or not. This should be either 'true' or 'false'. */
if (showUnixDotFiles == false)
{
/* If not ('false'), we should check if the filename starts with a period (indicating it's a UNIX dot-file). */
if (fileName.startsWith("."))
{
/* If so, we return a blank string to the function caller. Our job here, is done! */
return "";
};
};
/* Now, let's get everything after the period in the filename (i.e. the correct 'file extension'). */
fileExt = fileName.substr(1 + fileName.lastIndexOf("."));
/* Now that we've discovered the correct file extension, let's return it to the function caller. */
return fileExt;
};
¡Disfrútalo! Eres muy Bienvenido !:
Devuelve el nombre del archivo si no tiene extensión ... – PhiLho
¿No es costoso ejecutar la expresión regular dos veces? –
¿es mejor utilizar expresiones regulares que el último índice? Gracias. – melaos