Domanda

Per esempio, supponendo che x = filename.jpg, voglio ottenere filename, dove filename potrebbe essere qualsiasi nome di file (supponiamo che il nome del file contiene solo [a-zA-Z0-9-_] per semplificare.).

Ho visto x.substring(0, x.indexOf('.jpg')) su DZone Frammenti , ma non sarebbe x.substring(0, x.length-4) funzionare meglio? Non perché, length è una proprietà e fa fare la verifica dei caratteri, mentre indexOf() è una funzione e fa il controllo di carattere.

È stato utile?

Soluzione

Se si conosce la durata della proroga, è possibile utilizzare x.slice(0, -4) (dove 4 è i tre caratteri di estensione e il punto).

Se non si conosce la lunghezza @ John Hartsock regex sarebbe l'approccio giusto.

Se si preferisce non usare le espressioni regolari, si può provare questo (meno performante):

filename.split('.').slice(0, -1).join('.')

Si noti che verrà a mancare il file senza estensione.

Altri suggerimenti

Non sei sicuro di quello che sarebbe eseguire più velocemente, ma questo sarebbe più affidabile quando si tratta di un'estensione come .jpeg o .html

x.replace(/\.[^/.]+$/, "")

Nel node.js , il nome del file senza l'estensione può essere ottenuto come segue.

const path = require('path');
var filename = 'hello.html';

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

Ulteriori spiegazioni alla pagina Node.js documentazione .

x.length-4 rappresenta solo estensioni di 3 caratteri. Cosa fare se avete filename.jpeg filename.plor?

EDIT:

Per rispondere a ... certo, se si ha sempre un prolungamento della .jpg, x.length-4 avrebbe funzionato bene.

Tuttavia, se non si conosce la lunghezza della vostra estensione, qualsiasi di una serie di soluzioni sono migliori / più robusto.

x = x.replace(/\..+$/, '');

o

x = x.substring(0, x.lastIndexOf('.'));

o

x = x.replace(/(.*)\.(.*?)$/, "$1");

O (con il nome del file ipotesi ha un solo punto)

parts = x.match(/[^\.]+/);
x = parts[0];

O (anche con un solo punto)

parts = x.split(".");
x = parts[0];

È possibile utilizzare forse l'ipotesi che l'ultimo punto sarà il delimitatore estensione.

var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));

Se il file non ha alcuna estensione, ritornerà stringa vuota. Per risolvere che l'uso di questa funzione

function removeExtension(filename){
    var lastDotPosition = filename.lastIndexOf(".");
    if (lastDotPosition === -1) return filename;
    else return filename.substr(0, lastDotPosition);
}

Node.JS versioni precedenti alla 0.12.x:

path.basename(filename, path.extname(filename))

Naturalmente questo funziona anche in 0.12.x e più tardi.

Questo funziona, anche quando il delimitatore non è presente nella stringa.

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"

Può essere utilizzato anche come un one-liner in questo modo:

var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");

EDIT: Questa è una soluzione più efficiente:

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

Mi piace questo perché si tratta di un uno di linea, che non è troppo difficile da leggere:

filename.substring(0, filename.lastIndexOf('.')) || filename

Questo può anche essere fatto facilmente con il percorso utilizzando i metodi base e l'extname.

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))

Non so se si tratta di una valida opzione, ma io uso questo:

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.

Non è solo una sola operazione lo so, ma almeno dovrebbe sempre lavoro!

UPDATE: Se si desidera un'oneliner, qui sei:

(name.split('.').slice(0, -1)).join('.')

Un altro one-liner:

x.split(".").slice(0, -1).join(".")

Ecco un'altra soluzione regex-based:

filename.replace(/\.[^.$]+$/, '');

Questo dovrebbe tagliare fuori solo l'ultimo segmento.

La risposta accettata spoglia l'ultima parte di estensione solo (.jpeg), che potrebbe essere una buona scelta nella maggior parte dei casi.

Una volta ho dovuto mettere a nudo tutte le estensioni (.tar.gz) ei nomi dei file sono stati limitati a non contenere punti (in modo 2015-01-01.backup.tar non sarebbe un problema):

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");

un semplice:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;

Se è necessario elaborare una variabile che contiene il percorso completo (es .: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg") e si desidera tornare solo "nomefile" è possibile utilizzare:

theName = thePath.split("/").slice(-1).join().split(".").shift();

il risultato sarà theName == "filename" ;

Per provare scrivere il seguente comando nella finestra della console del debugger Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()

Se si deve elaborare solo il nome del file e la sua estensione (es .: theNameWithExt = "filename.jpg"):

theName = theNameWithExt.split(".").shift();

il risultato sarà theName == "file" , lo stesso come sopra;

Note:

  1. Il primo è un po 'più lento causa Garantisce i più operazioni; ma opere in entrambi i casi, in altre parole in grado di estrarre il nome del file senza estensione da una stringa che contiene un percorso o un nome di file con l'ex. Mentre il secondo funziona solo se la variabile data contiene un nome di file con ext come filename.ext ma è un po 'più veloce.
  2. Entrambe le soluzioni funzionano per entrambi i file locali e del server;

Ma non posso dire nulla né confronto le prestazioni con le altre risposte, né per il browser o la compatibilità del sistema operativo.

frammento di lavoro 1: il percorso completo

var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

frammento di lavoro 2: il nome del file con l'estensione

var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

frammento di lavoro 2: il nome del file con estensione doppia

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"

Anche se è piuttosto tardi, vorrei aggiungere un altro approccio per ottenere il nome del file senza estensione utilizzando vecchi JS pianura -

path.replace(path.substr(path.lastIndexOf('.')), '')

Questo è dove le espressioni regolari sono utili! Metodo .replace() di Javascript avrà un'espressione regolare, e si può utilizzare che per realizzare ciò che si vuole:

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");

Un altro uno di linea - si presume il nostro file è un jpg immagine >> es: var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'

È possibile utilizzare path da manovrare.

var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;

Output

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'
x.slice(0, -(x.split('.').pop().length + 1));

Questo è il codice che utilizzo per rimuovere l'estensione da un nome di file, senza utilizzare regex o indexOf (indexOf non è supportato in IE8). Si presuppone che l'estensione è qualsiasi testo dopo l'ultima '' carattere.

Si lavora per:

  • i file senza un'estensione: "lamialettera.tex dal computer terra"
  • i file con '' nel nome: "my.letter.txt"
  • sconosciuto lunghezza estensione del file: "my.letter.html"

Ecco il codice:

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

vorrei usare qualcosa come x.substring (0, x.lastIndexOf ( '')). Se stai andando per le prestazioni, non andare per javascript affatto :-p No, una dichiarazione più non importa per 99,99999% di tutti gli scopi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top