Par exemple, en supposant que x = filename.jpg
, je souhaite obtenir filename
, où filename
pourrait être n'importe quel nom de fichier (supposons que le nom de fichier ne contienne que [a-zA-Z0-9-_] pour simplifier.).
J'ai vu x.substring(0, x.indexOf('.jpg'))
sur DZone Snippets , mais x.substring(0, x.length-4)
n'a-t-il pas une meilleure performance? Parce que length
est une propriété et ne vérifie pas les caractères, alors que indexOf()
est une fonction et vérifie les caractères.
Si vous connaissez la longueur de l'extension, vous pouvez utiliser x.slice(0, -4)
(où 4 représente les trois caractères de l'extension et le point).
Si vous ne connaissez pas la longueur, @John Hartsock regex serait la bonne approche.
Si vous préférez ne pas utiliser d'expressions régulières, vous pouvez essayer ceci (moins performant):
filename.split('.').slice(0, -1).join('.')
Notez qu'il échouera sur les fichiers sans extension.
Je ne sais pas ce qui fonctionnerait plus rapidement, mais ce serait plus fiable en ce qui concerne les extensions telles que .jpeg
ou .html
x.replace(/\.[^/.]+$/, "")
Dans node.js, le nom du fichier sans extension peut être obtenu comme suit.
const path = require('path');
var filename = 'hello.html';
path.parse(filename).name; // hello
path.parse(filename).ext; // .html
Plus d'explications sur Node.jsdocumentation page.
x.length-4
ne représente que les extensions de 3 caractères. Que faire si vous avez filename.jpeg
ou filename.pl
?
MODIFIER:
Pour répondre ... bien sûr, si vous avez toujours une extension de .jpg
, x.length-4
fonctionnerait parfaitement.
Cependant, si vous ne connaissez pas la longueur de votre extension, plusieurs solutions sont meilleures/plus robustes.
x = x.replace(/\..+$/, '');
OR
x = x.substring(0, x.lastIndexOf('.'));
OR
x = x.replace(/(.*)\.(.*?)$/, "$1");
OU (avec l'hypothèse le nom de fichier n'a qu'un seul point)
parts = x.match(/[^\.]+/);
x = parts[0];
OU (également avec un seul point)
parts = x.split(".");
x = parts[0];
Vous pouvez peut-être utiliser l'hypothèse que le dernier point sera le délimiteur d'extension.
var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));
Si le fichier n'a pas d'extension, il retournera une chaîne vide. Pour résoudre ce problème, utilisez cette fonction
function removeExtension(filename){
var lastDotPosition = filename.lastIndexOf(".");
if (lastDotPosition === -1) return filename;
else return filename.substr(0, lastDotPosition);
}
Cela fonctionne même lorsque le délimiteur n'est pas présent dans la chaîne.
String.prototype.beforeLastIndex = function (delimiter) {
return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
}
"image".beforeLastIndex(".") // "image"
"image.jpeg".beforeLastIndex(".") // "image"
"image.second.jpeg".beforeLastIndex(".") // "image.second"
"image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"
Peut aussi être utilisé comme un liner comme ceci:
var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");
EDIT: C’est une solution plus efficace:
String.prototype.beforeLastIndex = function (delimiter) {
return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}
J'aime celui-ci parce que c'est un one-line qui n'est pas trop difficile à lire:
filename.substring(0, filename.lastIndexOf('.')) || filename
Un autre one-liner:
x.split(".").slice(0, -1).join(".")
Voici une autre solution basée sur regex:
filename.replace(/\.[^.$]+$/, '');
Cela ne devrait couper que le dernier segment.
Je ne sais pas si c'est une option valide mais j'utilise ceci:
name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.
Ce n’est pas une opération que je connaisse, mais au moins ça devrait toujours marcher!
UPDATE: Si vous voulez un oneliner, vous êtes ici:
(name.split('.').slice(0, -1)).join('.')
Un simple:
var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
La réponse acceptée supprime uniquement la dernière partie de l'extension (.jpeg
), ce qui peut constituer un bon choix dans la plupart des cas.
Une fois, j'ai dû effacer toutes les extensions (.tar.gz
) et les noms de fichiers ont été limités pour ne pas contenir de points (donc 2015-01-01.backup.tar
ne poserait pas de problème):
var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
Cela peut aussi être fait facilement avec path en utilisant les méthodes basename et extname.
const path = require('path')
path.basename('test.txt', path.extname('test.txt'))
Si vous devez traiter une variable qui contient le chemin complet (ex .: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
) et que vous souhaitez renvoyer uniquement "nom de fichier", vous pouvez utiliser:
theName = thePath.split("/").slice(-1).join().split(".").shift();
le résultat sera theName == "nom de fichier" ;
Pour l’essayer, écrivez la commande suivante dans la fenêtre de la console de votre débogueur Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()
Si vous ne devez traiter que le nom du fichier et son extension (ex: theNameWithExt = "filename.jpg"
):
theName = theNameWithExt.split(".").shift();
le résultat sera theName == "nom de fichier" , comme ci-dessus;
Mais je ne peux rien dire sur la comparaison des performances avec d'autres réponses, ni sur la compatibilité du navigateur ou du système d'exploitation.
extrait de travail 1: le chemin complet
var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
extrait de travail 2: le nom du fichier avec l’extension
var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
extrait de travail 2: le nom du fichier avec une double extension
var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
C'est ici que les expressions régulières sont utiles! La méthode .replace()
de Javascript prend une expression régulière, et vous pouvez l'utiliser pour accomplir ce que vous voulez:
// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");
x.slice(0, -(x.split('.').pop().length + 1));
Vous pouvez utiliser path
pour manœuvrer.
var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;
Sortie
> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'
Un autre support - nous supposons que notre fichier est une image jpg >> ex: var yourStr = 'test.jpg';
yourStr = yourStr.slice(0, -4); // 'test'
C'est le code que j'utilise pour supprimer l'extension d'un nom de fichier, sans utiliser regex ni indexOf (indexOf n'est pas pris en charge dans IE8). Cela suppose que l'extension est n'importe quel texte après le dernier '.' personnage.
Cela fonctionne pour:
Voici le code:
var filename = "my.letter.txt" // some filename
var substrings = filename.split('.'); // split the string at '.'
if (substrings.length == 1)
{
return filename; // there was no file extension, file was something like 'myfile'
}
else
{
var ext = substrings.pop(); // remove the last element
var name = substrings.join(""); // rejoin the remaining elements without separator
name = ([name, ext]).join("."); // readd the extension
return name;
}