Manuel, parte de nuestro staff, nos ha hecho el favor de crear este enunciado porque controla muy bien el tema.
Solución:
var url = "http://example.com/index.htm";
var filename = url.match(/([^/]+)(?=.w+$)/)[0];
Repasemos la expresión regular:
[^/]+ # one or more character that isn't a slash
(?= # open a positive lookahead assertion
. # a literal dot character
w+ # one or more word characters
$ # end of string boundary
) # end of the lookahead
Esta expresión recopilará todos los caracteres que no sean una barra inclinada seguidos inmediatamente (gracias a la anticipación) por una extensión y el final de la string — o, en otras palabras, todo después de la última barra y hasta la extensión.
Alternativamente, puede hacer esto sin expresiones regulares por completo, encontrando la posición de la última /
y el último .
utilizando lastIndexOf
y obteniendo un substring
entre esos puntos:
var url = "http://example.com/index.htm";
var filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
probado y funciona, incluso para páginas sin extensión de archivo.
var re = /([wd_-]*).?[^\/]*$/i;
var url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention";
alert(url.match(re)[1]); // 'regex-capture-filename-from-url-without-file-extention'
url = 'http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html';
alert(url.match(re)[1]); // 'uri-url-parsing'
([wd_-]*)
obtener una string que contengan letras, dígitos, guiones bajos o guiones..?
quizás el string va seguido de un punto.[^\/]*$
pero ciertamente no seguido por una barra o una barra invertida hasta el final./i
oh sí, ignora el caso.
No encontré que ninguna de las respuestas fuera lo suficientemente sólida. Aquí está mi solución.
function getFileName(url, includeExtension)
var matches = url && typeof url.match === "function" && url.match(//?([^/.]*).?([^/]*)$/);
if (!matches)
return null;
if (includeExtension && matches.length > 2 && matches[2])
return matches.slice(1).join(".");
return matches[1];
var url = "http://example.com/index.htm";
var filename = getFileName(url);
// index
filename = getFileName(url, true);
// index.htm
url = "index.htm";
filename = getFileName(url);
// index
filename = getFileName(url, true);
// index.htm
// BGerrissen's examples
url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention";
filename = getFileName(url);
// regex-capture-filename-from-url-without-file-extention
filename = getFileName(url, true);
// regex-capture-filename-from-url-without-file-extention
url = "http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html";
filename = getFileName(url);
// uri-url-parsing
filename = getFileName(url, true);
// uri-url-parsing.html
// BGerrissen fails
url = "http://gunblad3.blogspot.com/2008/05/uri%20url-parsing.html";
filename = getFileName(url);
// uri%20url-parsing
filename = getFileName(url, true);
// uri%20url-parsing.html
// George Pantazis multiple dots
url = "http://gunblad3.blogspot.com/2008/05/foo.global.js";
filename = getFileName(url);
// foo
filename = getFileName(url, true);
// foo.global.js
// Fringe cases
url = ;
filename = getFileName(url);
// null
url = null;
filename = getFileName(url);
// null
Para encajar con la pregunta original, el comportamiento predeterminado es excluir la extensión, pero eso se puede revertir fácilmente.
Si sostienes algún inconveniente y capacidad de aclarar nuestro escrito te proponemos realizar una crítica y con deseo lo leeremos.