2010-09-08 20 views
8

Estoy intentando crear una expresión regular de Javascript que capture el nombre de archivo sin la extensión de archivo. He leído las otras publicaciones aquí y 'goto esta página:http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html' parece ser la respuesta predeterminada. Esto no parece hacer el trabajo por mí. Así que aquí es cómo estoy tratando de que la expresión regular funcione:REGEX: nombre de archivo de captura desde la URL sin la extensión de archivo

  1. Encuentra la última barra inclinada '/' en la cadena del asunto.
  2. Captura todo entre esa barra y el próximo período.

Lo más cerca que pude conseguir fue:. /([^ /] ) \ w $ Qué sobre la cuerda 'http://example.com/index.htm' exec() capturaría /index.htm y índice.

Necesito esto para solo capturar índice.

Respuesta

39
var url = "http://example.com/index.htm"; 
var filename = url.match(/([^\/]+)(?=\.\w+$)/)[0]; 

Vamos a través de 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 recogerá todos los caracteres que no son una barra que se siguen inmediatamente (gracias al lookahead) por una extensión y el final de la cadena - o, en otras palabras, todo después de la última barra y hasta la extensión.

alternativa, puede hacer esto sin expresiones regulares en conjunto, mediante la búsqueda de la posición de la última / y el último . usando lastIndexOf y conseguir un substring entre esos puntos:

var url = "http://example.com/index.htm"; 
var filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf(".")); 
+1

Esta solución falla en nombres de archivos con períodos múltiples, si necesita esa prueba, vea la solución de @Gerrissen. –

1

Puede probar esta expresión regular:

([^/]*)\.[^.]*$ 
17

probado y funciona, incluso para páginas sin extensión de archivo.

var re = /([\w\d_-]*)\.?[^\\\/]*$/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' 

([\w\d_-]*) obtener una cadena que contiene letras, dígitos, guiones o guiones.
\.? quizás la cadena va seguida de un punto.
[^\\\/]*$ pero ciertamente no seguido de una barra o barra invertida hasta el final.
/i oh yeh, ignora el caso.

+0

Esto también captura nombres de archivos que tienen períodos múltiples, la respuesta aceptada falla en esos. (foo.global.js, etc.) –

0

No encontré ninguna de las respuestas suficientemente robusta. 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 adaptarse a la pregunta original, el comportamiento por defecto es para excluir la extensión, pero que es fácilmente reversible.

Cuestiones relacionadas