funzione js per ottenere il nome del file dall’URL

Ho un URL come http://www.example.com/blah/th.html

Ho bisogno di una funzione javascript per darmi il valore ‘th’ da quello.

Tutti i miei url hanno lo stesso formato (nomi di file di 2 lettere, con estensione .html).

Voglio che sia una funzione sicura, quindi se qualcuno passa in un url vuoto non si rompe.

So come verificare la lunghezza, ma dovrei controllare nullo a destra?

Usa la funzione partita.

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

Perché così difficile?

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

Simile agli altri, ma … ho usato lo script semplice di Tom: una singola riga,
allora puoi usare il nome del file var ovunque:
http://www.tomhoppe.com/index.php/2008/02/grab-filename-from-window-location/

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

lastIndexOf funzione substring combinata con lastIndexOf . Ciò consentirà nomi di file con periodi in essi ad esempio dati http://example.com/file.name.txt questo dà file.name differenza della risposta accettata che darebbe il file .

 function GetFilename(url) { if (url) { return url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf(".")); } return ""; } 

Una soluzione regex che tiene conto di query URL e identificatore di hash:

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

JSFiddle qui .

Usando jQuery con il plugin per l’ URL :

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

quelli non funzioneranno per url lenghty come
“/my/folder/questions.html#dssddsdsd?toto=33&dududu=podpodpo”

qui mi aspetto di ricevere “questions.html”. Quindi una ansible soluzione (lenta) è la seguente

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

allora puoi testare che in ogni caso ottieni solo il nome del file.

 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) 

(Mi piacerebbe vedere una soluzione più veloce o più intelligente)

  

Prova questo

 url.substring(url.lastIndexOf('/')+1, url.length) 

Questa risposta funziona solo nell’ambiente del browser. Non adatto per il 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'); } 

Perché i browser non supportano il new URL , potresti voler:

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

Ecco due funzioni:

  • il primo ottiene il nome del file dall’URL
  • la seconda ottiene il nome del file senza estensione da un nome file completo

Per l’analisi dell’URL, un nuovo object URL dovrebbe essere la scelta migliore. Si noti inoltre che l’URL non contiene sempre un nome file.

Avviso: questa funzione tenta di risolvere il nome file da un URL. Ma NON garantisce che il nome del file sia valido e adatto all’uso:

  • Alcuni sistemi operativi non consentono determinati caratteri nel nome del file (ad esempio : in windows, \0 nella maggior parte degli OS, …);
  • Alcuni nomi di file possono essere riservati dal sistema operativo (es. CON in windows);
  • Alcuni nomi di file possono rendere l’utente non felice di gestirlo (ad esempio un file chiamato “–help” in Linux)

Analogamente a quanto suggerito da @ user2492653, se tutto ciò che si desidera è il nome del file, come ad esempio quello di Firefox, allora il metodo split (), che spezza la stringa in una matrice di componenti, allora tutto ciò che occorre per fare è afferrare l’ultimo indice.

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

In pratica questo interromperà C: /fakepath/test.csv in {“C:”, “fakepath”, “test.csv”}

i miei 2 centesimi

il metodo LastIndexOf (“/”) in sé cade se le querystrings contengono “/”

Sappiamo tutti che “dovrebbero” essere codificati come %2F ma richiederebbe solo un valore senza escape per causare problemi.

Questa versione gestisce correttamente / ‘s in querystrings e non fa affidamento su. È nell’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); } 
 function getFileName(url) { // Remove the QueryString url = url.replace(/\?.*$/, ''); // Extract the last part return url.split('/').pop(); } 

da Come ottenere il nome del file da un percorso completo utilizzando JavaScript?

 var filename = fullPath.replace(/^.*[\\\/]/, '')