web-dev-qa-db-fra.com

fonction js pour obtenir le nom de fichier depuis l'url

J'ai une url comme http://www.example.com/blah/th.html

J'ai besoin d'une fonction javascript pour me donner la valeur 'th' qui en découle.

Toutes mes URL ont le même format (noms de fichiers de 2 lettres, avec extension .html).

Je veux que ce soit une fonction sûre, donc si quelqu'un passe dans une URL vide, il ne casse pas.

Je sais comment vérifier la longueur, mais je devrais vérifier la valeur null à droite?

37
Blankman

Utilisez la fonction de correspondance. 

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

Semblable aux autres, mais ... j'ai utilisé le script simple de Tom - une seule ligne,
alors vous pouvez utiliser le nom de fichier var n'importe où:
http://www.tomhoppe.com/index.php/2008/02/grab-filename-from-window-location/

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

Une solution regex qui prend en compte la requête URL et l'identifiant de hachage

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

JSFiddle ici .

5
Benjineer

J'utiliserais la fonction substring associée à lastIndexOf. Cela permettra de créer des noms de fichiers contenant des points, par exemple. étant donné http://example.com/file.name.txt ceci donne file.name contrairement à la réponse acceptée qui donnerait file.

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

Utilisation de jQuery avec le plugin URL :

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

Cela devrait fonctionner pour tous les cas

function getFilenameFromUrl(url: string): string {
  const pathname = new URL(url).pathname;
  const index = pathname.lastIndexOf('/');
  return (-1 !== index ? pathname.substring(index + 1) : pathname);
}
2
Victor

ceux qui ne fonctionneront pas pour les longues url comme
"/my/folder/questions.html#dssddsdsd?toto=33&dududu=podpodpo"

ici je m'attends à obtenir "questions.html" . Une solution possible (lente) est donc la suivante

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

alors vous pouvez tester que dans tous les cas, vous n'obtenez que le nom de fichier.

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)

(J'aimerais beaucoup voir une solution plus rapide ou plus intelligente)

2
Nadir
<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>
1
roenving

Cette réponse ne fonctionne que dans l'environnement du navigateur. Ne convient pas pour noeud.

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');
}

Pour les navigateurs ne supportant pas new URL, vous voudrez peut-être:

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

Voici deux fonctions:

  • le premier obtient le nom de fichier de l'url
  • le second obtient le nom de fichier sans extension d'un nom de fichier complet

Pour analyser l'URL, un nouvel objet URL devrait être le meilleur choix. Notez également que l'URL ne contient pas toujours un nom de fichier.

Avis: Cette fonction essaie de résoudre le nom de fichier à partir d'une URL. Mais cela ne garantit PAS que le nom du fichier est valide et utilisable:

  • Certains systèmes d'exploitation interdisent certains caractères dans le nom du fichier (par exemple, : dans Windows, \0 dans la plupart des systèmes d'exploitation, ...);
  • Certains noms de fichiers peuvent être réservés par le système d'exploitation (par exemple, CON dans Windows);
  • Certains noms de fichier peuvent empêcher l'utilisateur de le gérer (par exemple, un fichier nommé "--help" sous Linux).
1
tsh

De la même manière que @ user2492653 a suggéré, si tout ce que vous voulez est le nom du fichier tel que Firefox vous l’indique, alors vous utilisez la méthode split (), qui sépare la chaîne en un tableau de composants. indice.

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

Cela diviserait fondamentalement C: /fakepath/test.csv en {"C:", "fakepath", "test.csv"}

0
adam5990

Essaye ça

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

mes 2 cents

la méthode LastIndexOf ("/") en elle-même tombe si les chaînes de requête contiennent "/"

Nous savons tous qu'ils "devraient" être codés en tant que %2F, mais cela ne prend qu'une seule valeur non échappée pour causer des problèmes.

Cette version gère correctement les/dans les chaînes de requête et ne s'appuie pas sur. Dans l'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);
}
0
HeavenCore
function getFileName(url) {
  // Remove the QueryString
  url = url.replace(/\?.*$/, '');
  // Extract the last part
  return url.split('/').pop();
}
0
Karl.S