জাভাস্ক্রিপ্টের স্ট্রিং থেকে ফাইল এক্সটেনশানটি কীভাবে ছাঁটাবেন?


295

উদাহরণস্বরূপ, ধরে x = filename.jpgনিলাম যে আমি পেতে চাই filename, যেখানে filenameকোনও ফাইলের নাম থাকতে পারে (ধরে নেওয়া যাক ফাইলের নামটিতে কেবল [a-zA-Z0-9-_] সরল করার জন্য রয়েছে।)।

আমি দেখেছি x.substring(0, x.indexOf('.jpg'))উপর DZone বন্ধকৃত কিন্তু না x.substring(0, x.length-4)ভাল কার্য সম্পাদন করে? কারণ, lengthএটি একটি সম্পত্তি এবং চরিত্র যাচাই করে না যেখানে indexOf()একটি ফাংশন এবং চরিত্র পরীক্ষা করা হয়।



স্ট্যাকওভারফ্লো . com/ প্রশ্নস / ১৯৯৯91০৮৮ / এর মতো অনেক সুন্দর । এবং আপনি যদি এগুলির মধ্যে অনেকগুলি একটি হ্যাক না করেন তবে দক্ষতার জন্য উদ্বেগ হ'ল অকাল অপটিমাইজেশন।
আর্কিটিপাল পল

ES6 এর যুগে, প্যাথ মডিউলটিও দেখুন - আপনি নোডেজ ব্যবহার করছেন বা সঠিক প্রতিস্থাপনের ক্ষেত্রে
ফ্রাঙ্ক নোক 19

উত্তর:


173

আপনি যদি এক্সটেনশনের দৈর্ঘ্য জানেন তবে আপনি ব্যবহার করতে পারেন x.slice(0, -4)(যেখানে 4টি এক্সটেনশনের তিনটি অক্ষর এবং বিন্দু)।

আপনি যদি দৈর্ঘ্যটি জানেন না তবে @ জন হার্টসক রেজেক্স সঠিক পন্থা হবে।

আপনি যদি নিয়মিত এক্সপ্রেশন না ব্যবহার করতে চান তবে আপনি এটি চেষ্টা করতে পারেন (কম পারফরম্যান্ট):

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

নোট করুন যে এটি এক্সটেনশন ছাড়াই ফাইলগুলিতে ব্যর্থ হবে।


আমি এই সমাধানটি সেরা পছন্দ করি। এটি পরিষ্কার, এবং আমি ফাইল এক্সটেনশানটি সর্বদা থাকে বলে আমি এটি ব্যবহার করতে পারি .jpg। আমি রুবির মতো কিছু খুঁজছিলাম x[0..-5], এবং x.slice(0, -4)দুর্দান্ত দেখাচ্ছে! ধন্যবাদ! এবং প্রদত্ত অন্যান্য শক্তিশালী বিকল্পগুলির জন্য সকলকে ধন্যবাদ!
ma11 she28

22
এটি সর্বোত্তম সমাধান নয়, দয়া করে নীচের অন্যান্য সমাধানগুলি পরীক্ষা করুন।
বুঞ্জিবি

8
এবং যদি আপনি এক্সটেনশনের দৈর্ঘ্যের বিষয়ে 100% নিশ্চিত না হন তবে এটি করবেন না: "picture.jpeg".slice(0, -4)-> "ছবি"।
বেসিক

13
এটি বিপজ্জনক সমাধান, কারণ আপনি প্রকৃত বিন্যাসটির দৈর্ঘ্য জানেন না।
কোডার

"আপনি যদি এই এক্সটেনশনের দৈর্ঘ্য জানেন" এটি দশকের দশক পরেও এটি গ্রহণযোগ্য ধারণা ছিল। এটি আর ব্যবহার করবেন না।
আলেকজান্ডার -

453

দ্রুত কী সম্পাদন করবে তা নিশ্চিত নয় তবে এটির মতো .jpegবা সম্প্রসারনের ক্ষেত্রে এটি আরও নির্ভরযোগ্য হবে.html

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

15
আপনি সম্ভবত / পাথ বিভাজক হিসাবেও অস্বীকার করতে চান, সুতরাং রিজেক্সএক্সটি
/\.sel^/.

এটি ফাইলের কোনও প্রসারের (.txt বা .html বা .htaccess) দৈর্ঘ্যের জন্য কাজ করে এবং ফাইলের নামের জন্য অতিরিক্ত সময় (।) অক্ষর ধারণ করে। এটি পিরিয়ড যুক্ত এক্সটেনশনের কারণে যেমন .tar.gz পরিচালনা করবে না। কোনও ফাইল এক্সটেনশনের চেয়ে কোনও অতিরিক্ত সময়ের জন্য কোনও ফাইলের নামের পক্ষে এটি আরও সাধারণ। ধন্যবাদ!
স্টিভ সিগার

2
@ ভিক 'সঠিক উত্তর' এবং গৃহীত উত্তরের মধ্যে পার্থক্য রয়েছে। একটি স্বীকৃত উত্তর হ'ল উত্তর যা প্রশ্ন জিজ্ঞাসা করেছিল তার পক্ষে সহায়ক ছিল।
স্টিভেন

4
আমি মনে করি উইন্ডোজ প্ল্যাটফর্মের সাথে সমস্যা থাকতে পারে কারণ পিছনে স্ল্যাশ থাকতে পারে। সুতরাং রিজেক্সেপটি /\.sel^/\\.45+$/ হওয়া উচিত।
অ্যালেক্স চুয়েভ

1
এখানে @ElgsQianChen সাহায্যের উত্তর আপনার জন্য একটি দুর্দান্ত টুল আপনার প্রশ্নের regexr.com
জন Hartsock

279

ইন Node.js , নিম্নরূপ এক্সটেনশন ছাড়া ফাইলের নাম প্রাপ্ত করা যাবে।

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

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

নোড.জেএস ডকুমেন্টেশন পৃষ্ঠাতে আরও ব্যাখ্যা ।


2
আপনি @ কাসডুডের কথা যা বলছেন .... এই পদ্ধতিটি কার্যকরভাবে নোডের সম্প্রসারণকে সরিয়ে দেয়। আপনি কী প্রকাশ করতে চেয়েছিলেন তা নিশ্চিত নন, তবে এই পদ্ধতিটি মুক্তো কাজ করে।
এরিক

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
?? আপনার কাছে ফাইলের নাম থাকতে পারে: "গ্রীষ্ম.ফামিলি.জেপিজি" সেক্ষেত্রে বিভক্ত ('।') [0] কেবলমাত্র একটি আংশিক ফাইলের নাম ফিরিয়ে দেবে। আমি উত্তরটি থেকে সেটিকে সরিয়ে ফেলব, বা উদাহরণের জন্য ইস্যুটির নীচে পরিষ্কারভাবে উল্লেখ করব। @ বাসারত ...
রোকো সি

কিছু আমি প্রায়শই অংশ টুকরা সংক্রান্ত না:var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join(".");
radicand

x.split ("।") এমনকি একটি উত্তর হিসাবে বিবেচনা করা উচিত নয়। আমি জানি আমি একটি 'ব্যবহার করি।' আমার প্রায় সব ফাইল নামকরণের কনভেনশনগুলিতে, যেমন 'জরিপ।
লি ব্রিন্ডলি

@ লি 2808: সুতরাং কেবলমাত্র একটি বিন্দুর সতর্কতা। এটি কেবল অ্যাপ্লিকেশনটির উপর নির্ভর করে একাধিক পদ্ধতির উপস্থিতি দেখানোর জন্য। আমি অবশ্যই প্রায় সব ক্ষেত্রেই অন্য একটি পদ্ধতি ব্যবহার করব।
জেফ বি

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;এটি কাজ করে কারণ একটি খালি স্ট্রিং মিথ্যা, তাই এটি x প্রদান করে।
জোনাথন রোউনি

21

আমি এটি পছন্দ করি কারণ এটি একটি লাইনার যা পড়া খুব কঠিন নয়:

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.

আমি জানি এটি কেবল একটি অপারেশন নয়, তবে কমপক্ষে এটি সর্বদা কাজ করা উচিত!

আপডেট: আপনি যদি অনলাইনার চান, আপনি এখানে আছেন:

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


1
এটি নাম.জয়িন ('') নয় বরং নাম.জয়িন ('।') হওয়া উচিত। আপনি বিন্দু দ্বারা বিভক্ত hello.name.txthello, 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. প্রথমটি সামান্য ধীর কারণটি আরও ক্রিয়াকলাপ সম্পাদন করে; তবে উভয় ক্ষেত্রেই কাজ করে, অন্য কথায় এটি প্রদত্ত স্ট্রিং থেকে প্রস্থান ছাড়াই ফাইলের নামটি বের করতে পারে যার মধ্যে একটি পথ বা প্রাক্তন সহ একটি ফাইলের নাম রয়েছে। যখন দ্বিতীয়টি কেবল তখনই কাজ করে যদি প্রদত্ত ভেরিয়েবলটিতে ফাইলের নাম.সেক্সটের মতো একটি ফাইলের নাম থাকে তবে কিছুটা দ্রুত হয়।
  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

নোড.জেস সম্পূর্ণ পথ রক্ষণাবেক্ষণ ডিরেক্টরি থেকে এক্সটেনশন সরিয়ে দেয়

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 এছাড়াও এটি অর্জন করে তবে আমি এই পদ্ধতিকে কিছুটা শব্দার্থিকভাবে আনন্দদায়ক বলে মনে করি।

নোড.জেএস ভি 10.15.2 তে পরীক্ষিত।


0

এখান থেকেই নিয়মিত প্রকাশ পাওয়া যায়! জাভাস্ক্রিপ্টের .replace()পদ্ধতিটি একটি নিয়মিত ভাব প্রকাশ করবে এবং আপনি যা চান তা পূরণ করতে আপনি এটি ব্যবহার করতে পারেন:

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

0

অন্য একটি লাইনার - আমরা ধরে নিই যে আমাদের ফাইলটি একটি জেপিজি চিত্র >> প্রাক্তন: 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

এই কোডটি আমি ফাইল নাম থেকে এক্সটেনশানটি সরাতে ব্যবহার করি, রেগেক্স বা সূচিপত্র ব্যবহার না করেই (ইনডেক্স অফ আইই 8 তে সমর্থিত নয়)। এটি ধরে নিয়েছে যে এক্সটেনশনটি শেষের পরে কোনও পাঠ্য। ' অক্ষর।

এটি এর জন্য কাজ করে:

  • কোনও এক্সটেনশন ছাড়াই ফাইলগুলি: "মাইলেটটার"
  • 'দিয়ে ফাইল। নামে: "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
আসিফ আলী

# আসিফআলি ধন্যবাদ আপনি ঠিক বলেছেন, আমি ফাইল এক্সটেনশানটি পড়তে ভুলে গেছি। আমি উত্তর আপডেট করেছি, আমি আশা করি এটি এখন কার্যকর হয়।
লিটল ব্রেন

-3

আমি x.substring (0, x.lastIndexOf ('।')) এর মতো কিছু ব্যবহার করব। আপনি যদি পারফরম্যান্সের জন্য যাচ্ছেন তবে জাভাস্ক্রিপ্টের জন্য মোটেও যাবেন না :- পি না, আরও একটি বক্তব্য সত্যিকারের 99.99999% এর জন্য গুরুত্বপূর্ণ নয়।


2
"আপনি যদি পারফরম্যান্সের জন্য যাচ্ছেন তবে জাভাস্ক্রিপ্টের জন্য একেবারেই যাবেন না" - ওয়েব অ্যাপ্লিকেশনগুলিতে আপনি আর কী ব্যবহার করার পরামর্শ দিচ্ছেন ..?
টিজে

তিনি ওয়েব অ্যাপ্লিকেশনগুলির উল্লেখ করেন না।
লুকাস মোসকোপস

1
এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং 7 বছর আগে 2010 সালে পোস্ট করা হয়েছিল এবং জাভাস্ক্রিপ্টটি কেবল ওয়েব অ্যাপ্লিকেশনগুলিতে ব্যবহার করা হয়েছিল। (নোড সবেমাত্র জন্মগ্রহণ করেছিলেন, সেই সময়টিতে এটির গাইড বা এনপিএমও ছিল না)
টিজে

;-) তবুও, যদি এই জাতীয় কাজের ক্ষেত্রে পারফরম্যান্সের বিষয়টি গুরুত্বপূর্ণ হয় তবে আপনি এটি ব্যাকএন্ডে করা বিবেচনা করতে পারেন এবং ফলাফলগুলি অগ্রভাগে প্রক্রিয়া করতে পারেন।
লুকাস মোসকোপস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.