2009-02-04 16 views
28

tengo una URL como http://www.example.com/blah/th.htmljs función para obtener el nombre de archivo de la URL

necesito una función javascript que me diera el valor 'th' de eso.

Todas mis direcciones URL tienen el mismo formato (nombres de archivo de 2 letras, con extensión .html).

Quiero que sea una función segura, por lo que si alguien transfiere una URL vacía, no se rompe.

Sé cómo verificar la longitud, pero debería estar buscando nulo a la derecha?

+0

Posible duplicado de [¿Cómo obtener el nombre de archivo de una ruta completa usando JavaScript?] (https://stackoverflow.com/questions/423376/how-to -get-the-file-name-from-a-full-path-using-javascript) – Liam

Respuesta

19

Utilice la función de coincidencia.

function GetFilename(url) 
{ 
    if (url) 
    { 
     var m = url.toString().match(/.*\/(.+?)\./); 
     if (m && m.length > 1) 
     { 
     return m[1]; 
     } 
    } 
    return ""; 
} 
+8

Esto no funciona si tiene múltiples '.' múltiples en el nombre de archivo – James

1
<script type="text/javascript"> 
function getFileName(url){ 
    var path = window.location.pathName; 
    var file = path.replace(/^.*\/(\w{2})\.html$/i, "$1"); 
    return file ? file : "undefined"; 
} 
</script> 
2

Usando jQuery con el URL plugin:

var file = jQuery.url.attr("file"); 
var fileNoExt = file.replace(/\.(html|htm)$/, ""); 
// file == "th.html", fileNoExt = "th" 
9

Al igual que los otros, pero ... He usado script sencillo de Tom - una sola línea,
continuación, puede utilizar el nombre de archivo var en cualquier lugar:
http://www.tomhoppe.com/index.php/2008/02/grab-filename-from-window-location/

var filename = location.pathname.substr(location.pathname.lastIndexOf("/")+1); 
+0

La longitud es opcional Creo: location.pathname. substr (location.pathname.lastIndexOf ("/") + 1) –

3

que haría uso de la funcio substring n combinado con lastIndexOf. Esto permitirá nombres de archivos con períodos en ellos, p. dado http://example.com/file.name.txt esto da file.name a diferencia de la respuesta aceptada que daría file.

function GetFilename(url) 
{ 
    if (url) 
    { 
     return url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf(".")); 
    } 
    return ""; 
} 
87
var filename = url.split('/').pop() 
+7

Con mucho, la respuesta más simple y mejor. –

+7

¿Qué pasa si hay parámetros de consulta atrás? –

+1

Esto tampoco maneja identificadores de fragmentos de URL (es decir, # IDs) – benjineer

0

De manera similar a lo que @ user2492653 sugerido, si lo que quieres es el nombre del archivo como Firefox le da, entonces el método split(), que rompe la cadena en una matriz de componentes, entonces todo lo que necesitas hacer es tomar el último índice.

var temp = url.split("//"); 
if(temp.length > 1) 
return temp[temp.length-1] //length-1 since array indexes start at 0 

Esto sería básicamente romper C: /fakepath/test.csv en { "C:", "fakepath", "test.csv"}

1

los que no va a trabajar para url lenghty como
"/my/folder/questions.html#dssddsdsd?toto=33 & dududu = podpodpo"

aquí espero que me "questions.html". Así una posible solución (lenta) es la siguiente

fname=function(url) 
{ return url?url.split('/').pop().split('#').shift().split('?').shift():null } 

entonces se puede probar que en todo caso se obtiene sólo el nombre de archivo.

fname("/my/folder/questions.html#dssddsdsd?toto=33&dududu=podpodpo") 
-->"questions.html" 
fname("/my/folder/questions.html#dssddsdsd") 
-->"questions.html" 
fname("/my/folder/questions.html?toto=33&dududu=podpodpo") 
"-->questions.html" 

(and it works for null) 

(me gustaría ver una más rápida o solución más inteligente)

0

mis 2 centavos

la LastIndexOf ("/") método en sí misma, cae hacia abajo si las cadenas de consulta contienen "/"

todos sabemos que "deberían" ser codificados como %2F pero sólo se requeriría un valor no-escapado a causar problemas.

Esta versión usa bien 's/en las cadenas de consulta y no tiene dependencia de. De en la url

function getPageName() { 
    //#### Grab the url 
    var FullUrl = window.location.href; 

    //#### Remove QueryStrings 
    var UrlSegments = FullUrl.split("?") 
    FullUrl = UrlSegments[0]; 

    //#### Extract the filename 
    return FullUrl.substr(FullUrl.lastIndexOf("/") + 1); 
} 
1

Prueba este

url.substring(url.lastIndexOf('/')+1, url.length) 
0
function getFileName(url) { 
    // Remove the QueryString 
    url = url.replace(/\?.*$/, ''); 
    // Extract the last part 
    return url.split('/').pop(); 
} 
3

Una solución de expresiones regulares que representa Consulta de URL e identificador hash:

function fileNameFromUrl(url) { 
    var matches = url.match(/\/([^\/?#]+)[^\/]*$/); 
    if (matches.length > 1) { 
    return matches[1]; 
    } 
    return null; 
} 

JSFiddle here.

+0

Esta es la mejor respuesta al usar regex. – meYnot

27

¿Por qué es tan difícil?

var filename = url.split('/').pop().split('#')[0].split('?')[0];

+1

Bien hecho. Maneja la presencia o ausencia de '#' y/o '?'. – benjineer

+1

Esta debería ser la respuesta principal. –

+1

gracias. Esto es genial –

1

Esta respuesta sólo funciona en el entorno del navegador. No es adecuado para el nodo.

function getFilename(url) { 
    const filename = decodeURIComponent(new URL(url).pathname.split('/').pop()); 
    if (!filename) return 'index.html'; // some default filename 
    return filename; 
} 

function filenameWithoutExtension(filename) { 
    return filename.replace(/^(.+?)(?:\.[^.]*)?$/, '$1'); 
} 

Para los navegadores no soportan new URL, es posible que desee:

var a = document.createElement('a'); 
a.href = url; 
var pathname = a.pathname; 

Éstos son dos funciones:

  • primero uno y llévese el nombre de archivo del url
  • segundo obtener un nombre de archivo sin extensión de una nombre de archivo completo

Para analizar URL, un objeto nuevo URL debe ser la mejor opción. También tenga en cuenta que la URL no siempre contiene un nombre de archivo.

Aviso: Esta función intenta resolver el nombre del archivo desde una URL. Pero no garantizan que el nombre del archivo es válido y adecuado para su uso:

  • Algunos OS no ciertos caracteres en nombre de archivo (por ejemplo, : en las ventanas, \0 en la mayor parte del sistema operativo, ...);
  • Algunos de nombre de archivo pueden reservada por el sistema operativo (por ejemplo, en ventanas CON);
  • Algunos nombre de archivo puede hacer que el usuario infeliz para manejarlo (por ejemploun archivo llamado "--help" en Linux)
Cuestiones relacionadas