Saltar al contenido

REGEX: capturar nombre de archivo de URL sin extensión de archivo

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *