जावास्क्रिप्ट में एक स्ट्रिंग से फ़ाइल एक्सटेंशन ट्रिम कैसे करें?


295

उदाहरण के लिए, यह मानते हुए कि x = filename.jpgमैं प्राप्त करना चाहता हूं filename, जहां filenameकोई भी फ़ाइल नाम हो सकता है (मान लें कि फ़ाइल का नाम केवल सरल करने के लिए [a-zA-Z0-9-_] है।)।

मैंने DZone स्निपेट्सx.substring(0, x.indexOf('.jpg')) पर देखा , लेकिन बेहतर प्रदर्शन नहीं करेगा ? क्योंकि, एक संपत्ति है और चरित्र की जाँच नहीं करता है जबकि एक फ़ंक्शन है और चरित्र की जाँच करता है।x.substring(0, x.length-4)lengthindexOf()



बहुत ज्यादा stackoverflow.com/questions/1991608/… के रूप में ही है । और जब तक आप इनमें से एक की एक बिल्ली नहीं करते हैं, दक्षता के बारे में चिंता करना समयपूर्व अनुकूलन है।
आर्कितपाल पॉल

ईएस 6 की उम्र में, पथ मॉड्यूल भी देखें - यदि आप नोड्ज या उचित ट्रांसप्लीकेशन का उपयोग कर रहे हैं
फ्रैंक

जवाबों:


173

यदि आप एक्सटेंशन की लंबाई जानते हैं, तो आप उपयोग कर सकते हैं x.slice(0, -4)(जहां 4 एक्सटेंशन और डॉट के तीन वर्ण हैं)।

यदि आप लंबाई नहीं जानते हैं @ जॉन हार्टसॉक रेगेक्स सही दृष्टिकोण होगा।

यदि आप नियमित अभिव्यक्तियों का उपयोग नहीं करते हैं, तो आप यह (कम परफ़ॉर्मेंट) आज़मा सकते हैं:

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

ध्यान दें कि यह एक्सटेंशन के बिना फ़ाइलों पर विफल हो जाएगा।


मुझे यह घोल सबसे अच्छा लगता है। यह साफ है, और मैं इसका उपयोग कर सकता हूं क्योंकि मुझे पता है कि फाइल एक्सटेंशन हमेशा होता है .jpg। मैं रूबी की तरह कुछ ढूंढ रहा था x[0..-5], और x.slice(0, -4)बहुत अच्छा लग रहा था! धन्यवाद! और सभी अन्य मजबूत विकल्प प्रदान करने के लिए सभी को धन्यवाद!
ma11hew28

22
यह इष्टतम समाधान नहीं है, कृपया नीचे दिए गए अन्य समाधान देखें।
बनर्जी

8
और यदि आप एक्सटेंशन की लंबाई के बारे में 100% निश्चित नहीं हैं, तो यह न करें: "picture.jpeg".slice(0, -4)-> "चित्र।"
बेसिक

13
यह खतरनाक समाधान है, क्योंकि आप वास्तव में प्रारूप की लंबाई नहीं जानते हैं।
कोडर

"यदि आप विस्तार की लंबाई जानते हैं" तो दशकों से यह एक स्वीकार्य धारणा थी। अब यह प्रयोग न करें।
अलेक्जेंडर -

454

यकीन नहीं है कि क्या तेजी से प्रदर्शन करेगा लेकिन यह अधिक विश्वसनीय होगा जब यह .jpegया जैसे विस्तार के लिए आता है.html

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

15
आप शायद पथ विभाजक के रूप में भी / को अस्वीकार करना चाहते हैं, इसलिए regexp /\..I.////+++//
gsnedders

यह फ़ाइल एक्सटेंशन (.txt या .html या .htaccess) की किसी भी लंबाई के लिए काम करता है और फ़ाइल नाम के लिए अतिरिक्त अवधि (!) वर्ण रखने की भी अनुमति देता है। यह एक्सटेंशन की अवधि के कारण ही .tar.gz जैसे हैंडल नहीं करेगा। यह एक फ़ाइल नाम के लिए फ़ाइल एक्सटेंशन की तुलना में अतिरिक्त अवधि सम्‍मिलित करने के लिए अधिक आम है। धन्यवाद!
स्टीव सीजर

2
@ विक 'सही उत्तर' और स्वीकृत उत्तर के बीच अंतर है। एक स्वीकृत उत्तर केवल वह उत्तर है जो प्रश्न पूछने वाले के लिए सहायक था।
स्टीवन

4
मुझे लगता है कि विंडोज प्लेटफॉर्म के साथ समस्या हो सकती है क्योंकि बैक स्लैश हो सकते हैं। तो regexp होना चाहिए /\।
एलेक्स च्यूव

1
@ElgsQianChen यहाँ आपके लिए एक बढ़िया उपकरण है जो आपके प्रश्न का उत्तर देने में मदद के लिए regexr.com
John Hartsock

281

में Node.js , इस प्रकार विस्तार के बिना फ़ाइल का नाम प्राप्त किया जा सकता।

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

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

Node.js प्रलेखन पृष्ठ पर और स्पष्टीकरण ।


2
आप @kaasdude के बारे में क्या बात कर रहे हैं .... यह विधि नोड पर विस्तार को प्रभावी ढंग से हटाती है। निश्चित नहीं है कि आप क्या व्यक्त करना चाहते थे, लेकिन यह विधि मोती का काम करती है।
एरिक

1
यह उत्तर सर्वर-साइड नोड के लिए बहुत सीमित है। यदि आप प्रतिक्रिया कोड में इसका उपयोग करने का प्रयास करते हैं, तो यह आयात नहीं लगता है।
चार्ली

1
यदि आप निर्देशिकाओं सहित किसी पथ से एक्सटेंशन निकालना चाहते हैं, तो आप इसके var parsed = path.parse(filename)बाद कर सकते हैं path.join(parsed.dir, parsed.name)
जेसपरथेंडेंड

एक और संभावना है let base = path.basename( file_path, path.extname( file_path ) )
बाइकरल्सन

116

x.length-4केवल 3 वर्णों के एक्सटेंशन के लिए खाते। आप क्या पूछना चाहते हैं तो filename.jpegया filename.pl?

संपादित करें:

उत्तर देने के लिए ... निश्चित रूप से, यदि आपके पास हमेशा विस्तार होता है .jpg, x.length-4तो बस ठीक काम करेगा।

हालाँकि, यदि आप अपने विस्तार की लंबाई नहीं जानते हैं, तो कई समाधान बेहतर / अधिक मजबूत हैं।

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

या

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

या

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

या (अनुमान फ़ाइल नाम के साथ केवल एक बिंदु है)

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

या (केवल एक डॉट के साथ)

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

12
?? आपके पास एक फ़ाइल नाम पूर्व हो सकता है: "summer.family.jpg" उस मामले में विभाजन ('।') [0] केवल एक आंशिक फ़ाइल नाम लौटाएगा। मैं उस एक को उत्तर से हटा दूंगा, या स्पष्ट रूप से उस उदाहरण के लिए मुद्दे के नीचे रख दूंगा। @ बसरत ...
रोको सी। बुल्जन

कुछ मैं अक्सर भाग विभाजन के बारे में करता var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join(".");
हूं

x.split ("।") को भी उत्तर नहीं माना जाना चाहिए। मुझे पता है कि मैं 'का उपयोग करता हूं।' मेरी फ़ाइल के लगभग सभी नामकरण सम्मेलनों में, यानी 'सर्वे.कंट्रोलर.जेएस', या 'my.family.jpg'।
ली ब्रिंडले

@ ली २ dot०।: इसलिए केवल एक डॉट की चेतावनी। यह केवल यह दिखाने के लिए है कि आवेदन के आधार पर कई दृष्टिकोण हैं। मैं निश्चित रूप से लगभग सभी मामलों में अन्य विधियों में से एक का उपयोग करूंगा।
जेफ बी

x = x.substr(0, x.lastIndexOf('.'));- आप शायद मतलब x = x.substring(0, x.lastIndexOf('.'));?
द्ज़ाद बोरोवी

39

आप शायद इस धारणा का उपयोग कर सकते हैं कि अंतिम बिंदु एक्सटेंशन सीमांकक होगा।

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

यदि फ़ाइल में कोई एक्सटेंशन नहीं है, तो यह खाली स्ट्रिंग लौटेगा। इसे ठीक करने के लिए इस फ़ंक्शन का उपयोग करें

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

चेतावनी, यह विफल रहता है अगर कोई फ़ाइल नाम एक्सटेंशन नहीं होता है। आप एक खाली स्ट्रिंग के साथ बचे हैं।
ब्रैड

18
छोटा संस्करण जो बिना किसी बिंदु के खाता है। var f = x.substr(0, x.lastIndexOf('.')) || x;यह काम करता है क्योंकि एक खाली स्ट्रिंग मिथ्या है, इसलिए यह एक्स लौटाता है।
जोनाथन रोनी

22

मुझे यह पसंद है क्योंकि यह एक लाइनर है जिसे पढ़ना बहुत मुश्किल नहीं है:

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


12

यह तब भी काम करता है, जब स्ट्रिंग में सीमांकक मौजूद न हो।

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"

इस तरह से एक लाइनर के रूप में भी इस्तेमाल किया जा सकता है:

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

संपादित करें: यह एक अधिक कुशल समाधान है:

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

10

मुझे नहीं पता कि यह एक वैध विकल्प है लेकिन मैं इसका उपयोग करता हूं:

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.

यह सिर्फ एक ऑपरेशन नहीं है जिसे मैं जानता हूं, लेकिन कम से कम यह हमेशा काम करना चाहिए!

अद्यतन: यदि आप एक oneliner चाहते हैं, यहाँ आप हैं:

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


1
यह नाम नहीं होना चाहिए। ('') लेकिन नाम।जोइन (''))। आप डॉट से विभाजित होते हैं, लेकिन अल्पविराम से जुड़ते हैं, इसलिए hello.name.txtरिटर्न करते हैंhello, name
ईविल


7

यहाँ एक और रेगेक्स-आधारित समाधान है:

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

यह केवल अंतिम खंड को काट देना चाहिए।


7

सरल एक:

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

6

स्वीकृत उत्तर केवल अंतिम एक्सटेंशन भाग को स्ट्रिप्स करता है ( .jpeg), जो ज्यादातर मामलों में एक अच्छा विकल्प हो सकता है।

मुझे एक बार सभी एक्सटेंशनों को उतारना पड़ा ( .tar.gz) और फ़ाइल के नाम डॉट्स 2015-01-01.backup.tarनहीं होने के लिए प्रतिबंधित थे (इसलिए समस्या नहीं होगी):

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

4
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"

यह अब तक का एकमात्र तरीका है जो पूर्ण पथों के लिए काम करता है: path/name.ext-> paht/nameकेवल वापस लौटने के बजाय name, लेकिन मैं इसके साथ करना चाहूंगा, fs.parseहालांकि यह थोड़ी अधिक
क्रिया है

3

यदि आपको एक चर को संसाधित करना है जिसमें पूरा पथ शामिल है (उदा .:) thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"और आप केवल "फ़ाइल नाम" वापस करना चाहते हैं जिसका आप उपयोग कर सकते हैं:

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

परिणाम होगा नाम == "फ़ाइल नाम" ;

इसे अपने क्रोम डिबगर के कंसोल विंडो में निम्न कमांड लिखने की कोशिश करने के लिए: window.location.pathname.split("/").slice(-1).join().split(".").shift()

यदि आपको केवल फ़ाइल नाम और उसके विस्तार (उदा .:) को संसाधित करना है theNameWithExt = "filename.jpg":

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

परिणाम होगा नाम == "फ़ाइल नाम" , ऊपर के समान;

टिप्पणियाँ:

  1. पहला एक थोड़ा धीमा है क्योंकि अधिक संचालन करता है; लेकिन दोनों मामलों में काम करता है, दूसरे शब्दों में यह किसी दिए गए स्ट्रिंग से विस्तार के बिना फ़ाइल नाम को निकाल सकता है जिसमें एक पथ या फ़ाइल नाम पूर्व के साथ है। जबकि दूसरा केवल तभी काम करता है जब दिए गए वेरिएबल में फ़ाइल नाम जैसे ext के साथ एक फ़ाइल नाम होता है। लेकिन थोड़ा जल्दी होता है।
  2. दोनों समाधान स्थानीय और सर्वर दोनों फ़ाइलों के लिए काम करते हैं;

लेकिन मैं न तो अन्य उत्तरों के साथ तुलना प्रदर्शन और न ही ब्राउज़र या ओएस संगतता के बारे में कुछ नहीं कह सकता।

काम स्निपेट 1: पूरा रास्ता

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

कार्य स्निपेट 2: विस्तार के साथ फ़ाइल नाम

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

कार्य स्निपेट 2: डबल एक्सटेंशन के साथ फ़ाइल नाम

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


3

हालांकि यह बहुत देर हो चुकी है, मैं सादे पुराने जेएस का उपयोग करके विस्तार के बिना फ़ाइल नाम प्राप्त करने के लिए एक और दृष्टिकोण जोड़ूंगा-

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


या path.split('.').pop()एक भाग फाइल एक्सटेंशन के लिए
मिश्रणदेव

वह वास्तव में फ़ाइल नाम प्राप्त करने की कोशिश कर रहा था, न कि विस्तार!
मुनीम दिबोष

3

Node.js निर्देशिका को पूर्ण पथ से एक्सटेंशन को हटाते हैं

उदाहरण के लिए https://stackoverflow.com/a/31615711/895245 किया path/hello.html-> hello, लेकिन यदि आप चाहते हैं path/hello.html-> path/hello, तो आप इसका उपयोग कर सकते हैं:

#!/usr/bin/env node
const path = require('path');
const filename = 'path/hello.html';
const filename_parsed = path.parse(filename);
console.log(path.join(filename_parsed.dir, filename_parsed.name));

आउटपुट निर्देशिका के रूप में अच्छी तरह से:

path/hello

https://stackoverflow.com/a/36099196/895245 भी इसे प्राप्त करता है, लेकिन मुझे यह दृष्टिकोण थोड़ा अधिक अर्थपूर्ण रूप से भाता है।

Node.js v10.15.2 में परीक्षण किया गया।


0

यह वह जगह है जहाँ नियमित अभिव्यक्ति काम में आती है! जावास्क्रिप्ट की .replace()विधि एक नियमित अभिव्यक्ति लेगी, और आप इसका उपयोग कर सकते हैं कि आप क्या चाहते हैं:

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

0

एक अन्य लाइनर - हम मानते हैं कि हमारी फाइल एक jpg चित्र है। उदा: var yourStr = 'test.jpg';

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

0

आप pathपैंतरेबाज़ी करने के लिए उपयोग कर सकते हैं ।

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

उत्पादन

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'


0

यह वह कोड है जिसका उपयोग मैं फ़ाइल नाम से एक्सटेंशन को हटाने के लिए करता हूं, बिना रेगेक्स या इंडेक्सऑफ (इंडेक्सऑफ IE8 में समर्थित नहीं है) का उपयोग किए बिना। यह मानता है कि विस्तार अंतिम 'के बाद कोई भी पाठ है।' चरित्र।

इसके लिए काम करता है:

  • एक्सटेंशन के बिना फ़ाइलें: "myletter"
  • फाइलों के साथ '।' नाम में: "my.letter.txt"
  • फ़ाइल एक्सटेंशन की अज्ञात लंबाई: "my.letter.html"

यहाँ कोड है:

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

के साथ विफल रहता है hello.tar.gz, आउटपुट है hellotar
आसिफ अली

#AsifAli धन्यवाद, आप सही हैं, मैं फ़ाइल एक्सटेंशन पढ़ना भूल गया। मैंने जवाब अपडेट कर दिया है, मुझे उम्मीद है कि अब यह काम करेगा।
छोटा मस्तिष्क

-3

मैं x.substring (0, x.lastIndexOf ('।')) जैसी किसी चीज़ का उपयोग करूंगा। यदि आप प्रदर्शन के लिए जा रहे हैं, तो जावास्क्रिप्ट के लिए बिल्कुल न जाएं :- नहीं नहीं, एक और बयान वास्तव में सभी उद्देश्यों के 99.99999% के लिए मायने नहीं रखता है।


2
"यदि आप प्रदर्शन के लिए जा रहे हैं, तो जावास्क्रिप्ट के लिए बिल्कुल भी मत जाओ" - और क्या आप वेब अनुप्रयोगों में उपयोग करने का सुझाव दे रहे हैं ..?
TJ

वह वेब एप्लिकेशन का उल्लेख नहीं करता है।
लुकास मॉस्कोप्स

1
यह सवाल पूछा गया था और जवाब 7 साल पहले 2010 में पोस्ट किया गया था, और जावास्क्रिप्ट का उपयोग केवल वेब अनुप्रयोगों में ही किया गया था। (नोड बस पैदा हुआ था, उसके पास उस समय एक गाइड या एनपीएम भी नहीं था)
टीजे

;-) फिर भी, अगर इस तरह के कार्यों पर प्रदर्शन मायने रखता है, तो आप बैकएंड पर ऐसा करने पर विचार कर सकते हैं और परिणाम को सामने वाले पर संसाधित कर सकते हैं।
लुकास मॉस्कोप्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.