আমি কীভাবে জাভাস্ক্রিপ্ট দিয়ে ফাইল এক্সটেনশন পেতে পারি?


উত্তর:


794

নতুন সম্পাদনা: এই প্রশ্নটি প্রাথমিকভাবে পোস্ট হওয়ার পরে প্রচুর পরিমাণে পরিবর্তন হয়েছে - ওয়ালারারের সংশোধিত উত্তরের পাশাপাশি ভিজিওএন-এর দুর্দান্ত ভাঙ্গনের অনেকগুলি সত্যই আছে


সম্পাদনা করুন: কারণ এটি গ্রহণযোগ্য উত্তর; ওয়ালাসারের উত্তরটি অবশ্যই আরও ভাল:

return filename.split('.').pop();

আমার পুরানো উত্তর:

return /[^.]+$/.exec(filename);

এটা করা উচিত।

সম্পাদনা করুন: ফিলোর মন্তব্যের জবাবে এমন কিছু ব্যবহার করুন:

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;

1
দুবার রিজেক্স চালানো কি ব্যয়বহুল নয়?
অ্যান্ড্রু হেজেস

5
নীচে উচ্চ-রেট দেওয়া উত্তরটি আরও ভাল।
ফ্লেটম

2
দুর্ভাগ্যক্রমে উভয় সমাধান ফাইল এবং .htaccess এর মতো নামের জন্য ব্যর্থ ।
ভিজিওন

3
সমস্ত সম্ভাব্য কেসগুলি নিম্নরূপে প্রক্রিয়া করা হবে: ফাইলের নাম.স্প্লিট ("।") ফালি করুন (1) .পপ () || "";
JustAndrei

1
@ জাস্টআন্ড্রেই এখনও সব নয় :) বাস্তব কারণে বিশুদ্ধ ফাইলের নাম (বেসনেম?), কোনও পথ নয়, আমি মনে করি এটি হওয়া উচিত return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';এটি .file(ইউনিক্স লুকানো, আমি বিশ্বাস করি) ধরণের ফাইলেরও যত্ন নেয় । যদি আপনি এটি ওয়ান-লাইনার হিসাবে রাখতে চান তবে এটি আমার স্বাদে কিছুটা অগোছালো।
কুকার

832
return filename.split('.').pop();

সহজবোধ্য রাখো :)

সম্পাদনা:

এটি আরও একটি নন-রেজেক্স সমাধান যা আমি বিশ্বাস করি যে আরও দক্ষ:

return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;

কিছু কর্নার কেস রয়েছে যা নীচে ভিজিওএন এর উত্তর দ্বারা আরও ভালভাবে পরিচালনা করা হয়েছে , বিশেষত কোনও এক্সটেনশন ( .htaccessইত্যাদি অন্তর্ভুক্ত) ফাইলগুলি ।

এটি খুব পারফরম্যান্ট, এবং ""বিন্দুর আগে কোনও বিন্দু বা স্ট্রিং নেই যখন পূর্ণ স্ট্রিংয়ের পরিবর্তে ফিরে আসার মাধ্যমে কোণার কেসগুলি তর্কযোগ্যভাবে আরও ভালভাবে পরিচালনা করে। এটি পড়ার পক্ষে শক্ত হলেও এটি একটি খুব ভাল কারুকৃত সমাধান। এটি আপনার সহায়তাকারীদের পছন্দ মতো করুন এবং কেবল এটি ব্যবহার করুন।

পুরানো সম্পাদনা:

একটি নিরাপদ বাস্তবায়ন যদি আপনি কোনও এক্সটেনশন ছাড়াই ফাইলগুলিতে চালাচ্ছেন বা কোনও এক্সটেনশন ছাড়াই লুকানো ফাইলগুলি (উপরে টমের উত্তরে ভিজিওন-এর মন্তব্য দেখুন) এই লাইনের সাথে কিছু হবে

var a = filename.split(".");
if( a.length === 1 || ( a[0] === "" && a.length === 2 ) ) {
    return "";
}
return a.pop();    // feel free to tack .toLowerCase() here if you want

যদি a.lengthএটি এক হয়, এটি কোনও এক্সটেনশন ছাড়াই একটি দৃশ্যমান ফাইল ie ফাইল

যদি a[0] === ""এবং a.length === 2এটি কোনও এক্সটেনশন ছাড়াই একটি লুকানো ফাইল ie .htaccess

আশা করি এটি কিছুটা জটিল জটিল সমস্যাগুলি সমাধান করতে সহায়তা করে। পারফরম্যান্সের ক্ষেত্রে, আমি বিশ্বাস করি যে এই সমাধানটি বেশিরভাগ ব্রাউজারে রেগেক্সের চেয়ে কিছুটা ধীর । তবে, সর্বাধিক সাধারণ উদ্দেশ্যে এই কোডটি নিখুঁতভাবে ব্যবহারযোগ্য হবে।


4
আমি অভিনয় সম্পর্কে মন্তব্য করতে পারি না, তবে এটি অবশ্যই পরিষ্কার দেখায়! আমি এটি ব্যবহার করছি। +1
pc1oad1etter

6
তবে এক্ষেত্রে ফাইলের নামটি ফিল্মনাম.টেসটেস্ট.জেপিজি মত দেখাচ্ছে। দয়া করে আউটপুট বিবেচনা করুন। আমি আশা করি এটি মিথ্যা হবে।
ফিরো

19
সেক্ষেত্রে আউটপুটটি "jpg"
ওয়াল্যাকার

1
উজ্জ্বল! অনেক ধন্যবাদ. রেজেজেক্স ব্যবহার না করে সমাধান দেখতে ভাল লাগছে; আমি পিএইচপি দিয়ে এটি করেছি এবং এটি কেবল কয়েকটি ফাংশন ব্যবহার করে। +1
বোজ্যাংলেস

3
@ওয়ালাসার: filenameআসলে কোনও এক্সটেনশন না থাকলে কী হয় ? এটি কি বেস ফাইলটি সহজেই ফিরিয়ে দেবে না, যা খুব খারাপ হবে?
নিকল বোলাস 26'11

286

নিম্নলিখিত সমাধানটি বাল্ক ক্রিয়াকলাপগুলিতে ব্যবহার করতে এবং অতিরিক্ত বাইটগুলি সংরক্ষণ করার জন্য দ্রুত এবং যথেষ্ট সংক্ষিপ্ত :

 return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);

এখানে অন্য এক-লাইন নন-রিজেক্সপ সর্বজনীন সমাধান:

 return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1);

উভয়ই নামের সাথে সঠিকভাবে কাজ করে না (যেমন মাইফাইল ) বা .ডট (যেমন। Htaccess ) দিয়ে শুরু করে :

 ""                            -->   ""
 "name"                        -->   ""
 "name.txt"                    -->   "txt"
 ".htpasswd"                   -->   ""
 "name.with.many.dots.myext"   -->   "myext"

আপনি যদি গতি সম্পর্কে চিন্তা করেন তবে আপনি বেঞ্চমার্কটি চালাতে পারেন এবং সরবরাহিত সমাধানগুলি দ্রুততম হয় তা পরীক্ষা করতে পারেন , যখন সংক্ষিপ্তটি অতি দ্রুততর হয়:

গতির তুলনা

সংক্ষিপ্তটি কীভাবে কাজ করে:

  1. String.lastIndexOfপদ্ধতি "."প্রদত্ত স্ট্রিংয়ের (অর্থাৎ fname) স্ট্রিংয়ের (অর্থাৎ ) সর্বশেষ অবস্থানটি প্রদান করে । সাবস্ট্রিংটি পাওয়া না গেলে মেথড রিটার্ন দেয় -1
  2. ফাইলনামে বিন্দুর "অগ্রহণযোগ্য" অবস্থানগুলি হ'ল -1এবং 0যথাক্রমে কোনও এক্সটেনশন (উদাহরণস্বরূপ "name") এবং বিন্দু (যেমন ".htaccess") দিয়ে শুরু হওয়া নামগুলিকে উল্লেখ করে ।
  3. শূন্য-ভরাট ডান শিফ্ট অপারেটর ( >>>) শূন্য সঙ্গে ব্যবহার করে রূপান্তর ঋণাত্মক সংখ্যা প্রভাবিত -1করতে 4294967295এবং -2করতে 4294967294, যা ফাইলের নাম প্রান্ত ক্ষেত্রেই অপরিবর্তিত (ক কৌতুক সাজানোর এখানে) অবশিষ্ট জন্য দরকারী।
  4. String.prototype.sliceবর্ণিত হিসাবে গণনা করা হয়েছিল এমন অবস্থান থেকে ফাইলের অংশটি বের করে। পজিশনের সংখ্যাটি স্ট্রিং পদ্ধতির দৈর্ঘ্যের চেয়ে বেশি হলে রিটার্ন দেয় ""

আপনি যদি আরও সুস্পষ্ট সমাধান চান যা একই পথে কাজ করবে (পূর্ণ পথের অতিরিক্ত সমর্থন সহ) এছাড়াও, নিম্নলিখিত বর্ধিত সংস্করণটি দেখুন। এই দ্রবণটি পূর্ববর্তী ওয়ান-লাইনারের তুলনায় ধীর হবে তবে এটি বোঝা অনেক সহজ।

function getExtension(path) {
    var basename = path.split(/[\\/]/).pop(),  // extract file name from full path ...
                                               // (supports `\\` and `/` separators)
        pos = basename.lastIndexOf(".");       // get last position of `.`

    if (basename === "" || pos < 1)            // if file name is empty or ...
        return "";                             //  `.` not found (-1) or comes first (0)

    return basename.slice(pos + 1);            // extract extension ignoring `.`
}

console.log( getExtension("/path/to/file.ext") );
// >> "ext"

তিনটি রূপই ক্লায়েন্টের যে কোনও ওয়েব ব্রাউজারে কাজ করা উচিত এবং এটি সার্ভার সাইড নোডজেএস কোডেও ব্যবহার করা যেতে পারে।


5
কাজ করে না. "/home/user/.app/config" "অ্যাপ / কনফিগারেশন" প্রদান করে, যা সম্পূর্ণ ভুল।
mrbrdo

33
@ এমআরবার্ডো এই পদ্ধতিটি কেবল ফাইলের নাম সহ পুরো পথ নিয়ে কাজ করার কথা নয়, যেমনটি প্রশ্নের অনুরোধ রয়েছে। ডাউনভোটিংয়ের আগে সাবধানে প্রশ্ন পড়ুন।
ভিজিওন

8
কোডের যেমন তুচ্ছ লাইনটি অনুকূল করতে কেন দৈর্ঘ্যে যান? টিলড এবং বিটশিফ্ট অপারেটরগুলি জাভাস্ক্রিপ্টে খুব কমই দেখা যায় যে আমি এই জাতীয় উত্তর সমর্থন করতে পারি না। 1 লাইন কোড কীভাবে কাজ করে তা ব্যাখ্যা করতে যদি 5 টি বুলেট পয়েন্ট লাগে তবে কোডটি পুনরায় লেখার জন্য আরও ভাল তাই এটি আসলে বোধগম্য।
জ্যাকসন

6
এই এক লাইনের গতি কোনও প্রয়োগে উপলব্ধিযোগ্য পার্থক্য তৈরি করবে না। বিটওয়াইজ এত কম ব্যবহৃত হয় যে জেএসলিন্ট এবং জেএসহিন্টের মতো জনপ্রিয় লিটারগুলি তাদের ব্যবহারের বিরুদ্ধে সতর্ক করে দেয়। এই যুক্তির কার্যকারিতা এবং সংক্ষিপ্ততার উপর পর্যবেক্ষণ কোডের মানকে হ্রাস করেছে; যদি কোডটির "অতিরিক্ত তদন্ত প্রয়োজন," আমি এটি "খারাপ" বলে বিবেচনা করি।
জ্যাকসন

9
@ জ্যাকসন এটি বিবেচনা করা কোনও সমস্যার একাধিক সমাধান দেওয়ার জন্য একটি সাইট, এমন একটি সমাধান যা কার্য সম্পাদনকে অনুকূল করে তোলে এটি কখনই খারাপ জিনিস নয়। আপনার বক্তব্যটি "কোনও অ্যাপ্লিকেশনটিতে অনুভূতিযুক্ত কোনও পার্থক্য তৈরি করবে না" এটি আপনার ব্যবহারযোগ্য সম্ভাব্য অ্যাপ্লিকেশনগুলির সংকীর্ণ সুযোগের ভিত্তিতে সম্পূর্ণরূপে তৈরি করা হয়েছে, এর বাইরেও, এটি সমস্যার সমাধানের দিকে তাকিয়ে এমন কাউকে সরবরাহ করতে পারে যাতে তারা কিছুটা অনুকূল করতে পারে তারা লিখছেন এমন একটি কম্পিউটিং নিবিড় অ্যাপ্লিকেশন তৈরি করার জন্য তাদের অন্যান্য কোড তৈরি করতে হবে।
nrylee

33
function getFileExtension(filename)
{
  var ext = /^.+\.([^.]+)$/.exec(filename);
  return ext == null ? "" : ext[1];
}

দিয়ে পরীক্ষিত

"a.b"     (=> "b") 
"a"       (=> "") 
".hidden" (=> "") 
""        (=> "") 
null      (=> "")  

এছাড়াও

"a.b.c.d" (=> "d")
".a.b"    (=> "b")
"a..b"    (=> "b")

এটি IE এ কাজ করতে: var প্যাটার্ন = "^। + \\। ([^।] +) $"; var ext = নতুন RegExp (প্যাটার্ন);
spc16670




8
function file_get_ext(filename)
    {
    return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false;
    }

8

কোড

/**
 * Extract file extension from URL.
 * @param {String} url
 * @returns {String} File extension or empty string if no extension is present.
 */
var getFileExtension = function (url) {
    "use strict";
    if (url === null) {
        return "";
    }
    var index = url.lastIndexOf("/");
    if (index !== -1) {
        url = url.substring(index + 1); // Keep path without its segments
    }
    index = url.indexOf("?");
    if (index !== -1) {
        url = url.substring(0, index); // Remove query
    }
    index = url.indexOf("#");
    if (index !== -1) {
        url = url.substring(0, index); // Remove fragment
    }
    index = url.lastIndexOf(".");
    return index !== -1
        ? url.substring(index + 1) // Only keep file extension
        : ""; // No extension found
};

পরীক্ষা

লক্ষ্য করুন যে কোনও প্রশ্নের অনুপস্থিতিতে খণ্ডটি এখনও উপস্থিত থাকতে পারে।

"https://www.example.com:8080/segment1/segment2/page.html?foo=bar#fragment" --> "html"
"https://www.example.com:8080/segment1/segment2/page.html#fragment"         --> "html"
"https://www.example.com:8080/segment1/segment2/.htaccess?foo=bar#fragment" --> "htaccess"
"https://www.example.com:8080/segment1/segment2/page?foo=bar#fragment"      --> ""
"https://www.example.com:8080/segment1/segment2/?foo=bar#fragment"          --> ""
""                                                                          --> ""
null                                                                        --> ""
"a.b.c.d"                                                                   --> "d"
".a.b"                                                                      --> "b"
".a.b."                                                                     --> ""
"a...b"                                                                     --> "b"
"..."                                                                       --> ""

JSLint

0 সতর্কতা।


7

দ্রুত এবং পাথ সহ সঠিকভাবে কাজ করে

(filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop()

কিছু প্রান্ত ক্ষেত্রে

/path/.htaccess => null
/dir.with.dot/file => null

বিভাজনের সাহায্যে সমাধানগুলি ধীর এবং শেষের সমাধানগুলি শেষ প্রান্তের সাথে পরিচালনা করে না edge


আপনি কোন এজ কেস বলতে চাইছেন? দয়া করে এখানে আমার সমাধানটি দেখুন: stackoverflow.com/a/12900504/1249581 । এটি সব ক্ষেত্রেই সূক্ষ্মভাবে কাজ করে এবং কোনও রেজেক্সের চেয়ে অনেক দ্রুত।
ভিজিওন

আমি ইতিমধ্যে প্রান্তের মামলাগুলি তালিকাভুক্ত করেছি। এবং আপনার সমাধান এগুলি সঠিকভাবে পরিচালনা করে না। আমি ইতিমধ্যে লিখেছি যেমন, "/dir.with.dot/file" চেষ্টা করুন। আপনার কোডটি "ডট / ফাইল" দেয় যা হাস্যকরভাবে ভুল।
mrbrdo

1
কেউ পথ ছড়িয়ে দেওয়ার অনুরোধ করেনি। প্রশ্নটি ফাইলের নামগুলি থেকে এক্সটেনশন আহরণের ছিল।
ভিজিওন

3
আমি আপনাকে ইতিমধ্যে বলেছি, এটি স্পষ্টভাবে কখনও বলা হয়নি, এবং একটি সমাধান যা পথগুলি পরিচালনা করে তা সম্ভবত আরও অনেক কার্যকর। এসও-তে একটি প্রশ্নের উত্তর প্রশ্ন করা ব্যক্তিটি ছাড়াও অন্যান্য ব্যক্তির পক্ষে দরকারী বলে মনে করা হচ্ছে। আমি সত্যিই মনে করি না যে এমন কোনও সমাধান যা ইনপুটগুলির একটি সুপারসেট পরিচালনা করে তাকে হ্রাস করা উচিত।
mrbrdo

3
ডাউনভোটটি বৈশ্বিক চলকটির সাথে ব্যবহারের জন্য ছিল .exec()। আপনার কোড হিসাবে ভাল হবে (filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
ভিজিওন

6

আমি এই ভাগ করতে চেয়েছিলাম।

fileName.slice(fileName.lastIndexOf('.'))

যদিও এর একটি অবক্ষয় রয়েছে যে কোনও এক্সটেনশন ছাড়াই থাকা ফাইলগুলি শেষ স্ট্রিংটি ফিরে আসবে। তবে আপনি যদি এটি করেন তবে এটি প্রতিটি জিনিস ঠিক করবে:

   function getExtention(fileName){
     var i = fileName.lastIndexOf('.');
     if(i === -1 ) return false;
     return fileName.slice(i)
   }

যতদূর আমি মনে করি sliceপদ্ধতিটি স্ট্রিংয়ের পরিবর্তে অ্যারেগুলিকে বোঝায়। স্ট্রিং substrবা substringকাজ করবে জন্য।
ভিজিওন

@ ভিজিওএন তবে আমার ধারণা আপনার জানা উচিত যে সেখানেও রয়েছে String.prototype.sliceএবং Array.prototype.sliceএটি উভয়ই কাজ পদ্ধতিতে ধরণের
হুসেন নাজল

1
অই হ্যাঁ. তুমি ঠিক. এই পদ্ধতিটি সম্পর্কে সম্পূর্ণরূপে ভুলে গেছি। আমার খারাপ।
ভিজিওএন

5

আমি নিশ্চিত যে ভবিষ্যতে কেউ আমার কোডকে ছোট করে এবং / অথবা অনুকূলিত করতে পারে and তবে এই মুহুর্তে আমি 200% আত্মবিশ্বাসী যে আমার কোড প্রতিটি অনন্য পরিস্থিতিতে (যেমন কেবলমাত্র ফাইলের নাম , আপেক্ষিক , মূল-আপেক্ষিক , এবং পরম ইউআরএল, খণ্ডিত # ট্যাগ সহ কোয়েরি ? স্ট্রিং সহ, এবং যা কিছু অন্যথায় আপনি এটিকে নিক্ষেপ করার সিদ্ধান্ত নিতে পারেন), নির্দ্বিধায় এবং পিন-পয়েন্ট যথার্থতার সাথে।

প্রমাণের জন্য, দেখুন: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php

এখানে জেএসফিডাল: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/

অতিরিক্ত আত্মবিশ্বাসী হতে হবে না বা নিজের শিংগা ফুঁকবে না, তবে আমি এই কাজের জন্য কোনও কোডের ব্লক দেখিনি ( বিভিন্ন ইনপুট আর্গুমেন্টের ব্যাটারির মধ্যে 'সঠিক' ফাইল এক্সটেনশনটি সন্ধান করা function) যা এটি কাজ করে।

দ্রষ্টব্য: ডিজাইন অনুসারে যদি প্রদত্ত ইনপুট স্ট্রিংয়ের জন্য কোনও ফাইল এক্সটেনশন উপস্থিত না থাকে তবে এটি কেবল একটি ফাঁকা স্ট্রিং দেয় "", ত্রুটি বা ত্রুটি বার্তা নয়।

এটি দুটি যুক্তি লাগে:

  • স্ট্রিং: fileNameOrURL (স্ব-ব্যাখ্যামূলক)

  • বুলিয়ান: শো ইউনিক্সডটফাইলস (বিন্দু দিয়ে শুরু হওয়া ফাইলগুলি প্রদর্শিত হবে কিনা "।")

নোট (2): আপনি আমার কোড মত, লাইব্রেরির, এবং / অথবা রেপো আসুন আপনার JS এটি যোগ করতে, কারণ আমি এটা উপসংহার উপর কঠোর পরিশ্রম নিশ্চিত করা, এবং এটি নষ্ট করতে যেতে একটি লজ্জা হবে না। সুতরাং, আরও অ্যাডো না করে, এটি এখানে:

function getFileExtension(fileNameOrURL, showUnixDotFiles)
    {
        /* First, let's declare some preliminary variables we'll need later on. */
        var fileName;
        var fileExt;

        /* Now we'll create a hidden anchor ('a') element (Note: No need to append this element to the document). */
        var hiddenLink = document.createElement('a');

        /* Just for fun, we'll add a CSS attribute of [ style.display = "none" ]. Remember: You can never be too sure! */
        hiddenLink.style.display = "none";

        /* Set the 'href' attribute of the hidden link we just created, to the 'fileNameOrURL' argument received by this function. */
        hiddenLink.setAttribute('href', fileNameOrURL);

        /* Now, let's take advantage of the browser's built-in parser, to remove elements from the original 'fileNameOrURL' argument received by this function, without actually modifying our newly created hidden 'anchor' element.*/ 
        fileNameOrURL = fileNameOrURL.replace(hiddenLink.protocol, ""); /* First, let's strip out the protocol, if there is one. */
        fileNameOrURL = fileNameOrURL.replace(hiddenLink.hostname, ""); /* Now, we'll strip out the host-name (i.e. domain-name) if there is one. */
        fileNameOrURL = fileNameOrURL.replace(":" + hiddenLink.port, ""); /* Now finally, we'll strip out the port number, if there is one (Kinda overkill though ;-)). */  

        /* Now, we're ready to finish processing the 'fileNameOrURL' variable by removing unnecessary parts, to isolate the file name. */

        /* Operations for working with [relative, root-relative, and absolute] URL's ONLY [BEGIN] */ 

        /* Break the possible URL at the [ '?' ] and take first part, to shave of the entire query string ( everything after the '?'), if it exist. */
        fileNameOrURL = fileNameOrURL.split('?')[0];

        /* Sometimes URL's don't have query's, but DO have a fragment [ # ](i.e 'reference anchor'), so we should also do the same for the fragment tag [ # ]. */
        fileNameOrURL = fileNameOrURL.split('#')[0];

        /* Now that we have just the URL 'ALONE', Let's remove everything to the last slash in URL, to isolate the file name. */
        fileNameOrURL = fileNameOrURL.substr(1 + fileNameOrURL.lastIndexOf("/"));

        /* Operations for working with [relative, root-relative, and absolute] URL's ONLY [END] */ 

        /* Now, 'fileNameOrURL' should just be 'fileName' */
        fileName = fileNameOrURL;

        /* Now, we check if we should show UNIX dot-files, or not. This should be either 'true' or 'false'. */  
        if ( showUnixDotFiles == false )
            {
                /* If not ('false'), we should check if the filename starts with a period (indicating it's a UNIX dot-file). */
                if ( fileName.startsWith(".") )
                    {
                        /* If so, we return a blank string to the function caller. Our job here, is done! */
                        return "";
                    };
            };

        /* Now, let's get everything after the period in the filename (i.e. the correct 'file extension'). */
        fileExt = fileName.substr(1 + fileName.lastIndexOf("."));

        /* Now that we've discovered the correct file extension, let's return it to the function caller. */
        return fileExt;
    };

উপভোগ করুন! আপনি বেশ স্বাগতম !:


1
অসাধারণ. ধন্যবাদ!
গলিজেয়ার

5

// 获取文件后缀名
function getFileExtension(file) {
  var regexp = /\.([0-9a-z]+)(?:[\?#]|$)/i;
  var extension = file.match(regexp);
  return extension && extension[1];
}

console.log(getFileExtension("https://www.example.com:8080/path/name/foo"));
console.log(getFileExtension("https://www.example.com:8080/path/name/foo.BAR"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz/foo.bar?key=value#fragment"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz.bar?key=value#fragment"));


5

আপনি যদি ওয়েব ইউআরএল নিয়ে কাজ করে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন:

function getExt(filepath){
     return filepath.split("?")[0].split("#")[0].split('.').pop();
}

getExt("../js/logic.v2.min.js") // js
getExt("http://example.net/site/page.php?id=16548") // php
getExt("http://example.net/site/page.html#welcome.to.me") // html
getExt("c:\\logs\\yesterday.log"); // log

ডেমো: https://jsfiddle.net/squadjot/q5ard4fj/


আমি আপনার সমাধানটি সত্যিই পছন্দ করি। এটি এত সামান্য সঙ্গে অনেক কিছু করে। আমি এটি ব্যবহার করব।
জুলিউস ম্যানসন

4

এটা চেষ্টা কর:

function getFileExtension(filename) {
  var fileinput = document.getElementById(filename);
  if (!fileinput)
    return "";
  var filename = fileinput.value;
  if (filename.length == 0)
    return "";
  var dot = filename.lastIndexOf(".");
  if (dot == -1)
    return "";
  var extension = filename.substr(dot, filename.length);
  return extension;
}

3
return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1");

সম্পাদনা: আশ্চর্যরূপে (বা এটি সম্ভবত এটি নয়) $1প্রতিস্থাপন পদ্ধতির দ্বিতীয় যুক্তিতে কাজ করা মনে হয় না ... দুঃখিত।


1
এটি নিখুঁতভাবে কাজ করে, তবে আপনি মিস করেছেন যে আপনাকে স্ট্রিংয়ের অন্যান্য সমস্ত সামগ্রী সরিয়ে ফেলতে হবে: ফাইল নাম.রেপেস রিটার্ন করুন (/^.*? \। ([A-zA-Z0-9] +) $ /, "$ 1");
রোম্যানিং

3

আমি কেবল বুঝতে পেরেছিলাম যে p4bl0- এর উত্তরে মন্তব্য করা যথেষ্ট নয়, যদিও টমের উত্তর পরিষ্কারভাবে সমস্যার সমাধান করে:

return filename.replace(/^.*?\.([a-zA-Z0-9]+)$/, "$1");

3

বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য, একটি সাধারণ স্ক্রিপ্ট যেমন

return /[^.]+$/.exec(filename);

ঠিক কাজ করবে (যেমন টম সরবরাহ করেছেন) provided তবে এটি বোকা প্রমাণ নয়। নিম্নলিখিত ফাইলের নাম সরবরাহ করা হলে এটি কাজ করে না:

image.jpg?foo=bar

এটি কিছুটা ওভারকিল হতে পারে তবে আমি অনাকাঙ্ক্ষিত ফাইল নামগুলির কারণে ব্যর্থতা এড়াতে এই জাতীয় url যেমন পার্সার ব্যবহার করার পরামর্শ দেব ।

নির্দিষ্ট ফাংশনটি ব্যবহার করে আপনি ফাইলের নামটি এইভাবে পেতে পারেন:

var trueFileName = parse_url('image.jpg?foo=bar').file;

এটি url vars ছাড়াই "image.jpg" আউটপুট দেবে। তারপরে আপনি ফাইল এক্সটেনশন দখল করতে মুক্ত হন free


3
function func() {
  var val = document.frm.filename.value;
  var arr = val.split(".");
  alert(arr[arr.length - 1]);
  var arr1 = val.split("\\");
  alert(arr1[arr1.length - 2]);
  if (arr[1] == "gif" || arr[1] == "bmp" || arr[1] == "jpeg") {
    alert("this is an image file ");
  } else {
    alert("this is not an image file");
  }
}

3
function extension(fname) {
  var pos = fname.lastIndexOf(".");
  var strlen = fname.length;
  if (pos != -1 && strlen != pos + 1) {
    var ext = fname.split(".");
    var len = ext.length;
    var extension = ext[len - 1].toLowerCase();
  } else {
    extension = "No extension found";
  }
  return extension;
}

// ব্যবহার

এক্সটেনশন ( 'file.jpeg')

সর্বদা এক্সটেনশানটি কম কাস প্রদান করে যাতে আপনি এটি ফিল্ড চেঞ্জের জন্য এটি পরীক্ষা করতে পারেন:

file.JpEg

ফাইল (কোনও এক্সটেনশন নেই)

ফাইল। (Noextension)


3

আপনি যদি কোনও নির্দিষ্ট এক্সটেনশান সন্ধান করছেন এবং এর দৈর্ঘ্য জানেন, আপনি সাবস্ট্রাস্ট ব্যবহার করতে পারেন :

var file1 = "50.xsl";

if (file1.substr(-4) == '.xsl') {
  // do something
}

জাভাস্ক্রিপ্ট রেফারেন্স: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / স্ট্রিং/ সুবস্ট্র


1
সৌন্দর্য সরলতার সাথে আসে। এটি হ'ল স্মার্ট, আরও মার্জিত এবং আরও দক্ষ উত্তর। আমি উইন্ডোজ ভিত্তিক সিস্টেমে এক্সটেনশন দখল করতে সর্বদা String.substr (-3) বা String.substr (-4) ব্যবহার করি। কেন কেউ এর জন্য নিয়মিত প্রকাশ এবং ক্রেজি লুপ ব্যবহার করতে চান।
asiby

13
@ এসিবি এই ধরণের সমাধানগুলি মহাকাশ রকেট লঞ্চের পরে বিধ্বস্ত হওয়ার মূল কারণ।
ভিজিওন

3

আমি পার্টিতে অনেক চাঁদ নিয়েছি তবে সরলতার জন্য আমি এই জাতীয় কিছু ব্যবহার করি

var fileName = "I.Am.FileName.docx";
var nameLen = fileName.length;
var lastDotPos = fileName.lastIndexOf(".");
var fileNameSub = false;
if(lastDotPos === -1)
{
    fileNameSub = false;
}
else
{
    //Remove +1 if you want the "." left too
    fileNameSub = fileName.substr(lastDotPos + 1, nameLen);
}
document.getElementById("showInMe").innerHTML = fileNameSub;
<div id="showInMe"></div>


3

pathমডিউলে এটির জন্য একটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন রয়েছে :

import path from 'path';

console.log(path.extname('abc.txt'));

আউটপুট:

.txt

সুতরাং, আপনি যদি কেবল ফর্ম্যাটটি চান:

path.extname('abc.txt').slice(1) // 'txt'

যদি কোনও এক্সটেনশন না থাকে তবে ফাংশনটি একটি খালি স্ট্রিং ফিরিয়ে দেবে:

path.extname('abc') // ''

আপনি যদি নোড ব্যবহার করেন তবে pathঅন্তর্নির্মিত। আপনি যদি ব্রাউজারটিকে লক্ষ্য করে নিচ্ছেন তবে ওয়েবপ্যাক pathআপনার জন্য একটি বাস্তবায়ন বান্ডিল করবে । আপনি যদি ওয়েবপ্যাক ছাড়াই ব্রাউজারটিকে লক্ষ্য করে রাখছেন তবে আপনি অন্তর্ভুক্ত করতে পারেন নিজেই প্যাথ-

স্ট্রিং বিভক্তকরণ বা রেজেক্স করার কোনও কারণ নেই।


নোড সম্পর্কে কে কিছু বলল?
শ্যানন হচকিনস

বিভাজন বা নিয়মিত এক্সপ্রেশন না ব্যবহারের জন্য আপনার যুক্তি হ'ল নোডের সাথে প্লাগইন অন্তর্ভুক্ত করা বা বান্ডিল করা, এটি একটি
মেনাল

@ শ্যাননহোককিন্স বেশিরভাগ সময় এই জিনিসগুলি যেভাবেই সেট আপ করেন
sdgfsdh ২

@ আন্ড্রেইড্রাগনেস্কু আমি এটাকে ঘৃণ্য করার ইচ্ছা করিনি, তাই এটি টানিয়ে দিয়েছি।
sdgfsdh

3

"ওয়ান মাছ ধরার নৌকা" ব্যবহার ফাইলের নাম এবং এক্সটেনশন পেতে reduceএবং অ্যারে ডেসট্রাকচারিং :

var str = "filename.with_dot.png";
var [filename, extension] = str.split('.').reduce((acc, val, i, arr) => (i == arr.length - 1) ? [acc[0].substring(1), val] : [[acc[0], val].join('.')], [])

console.log({filename, extension});

আরও ভাল ইন্ডেন্টেশন সহ:

var str = "filename.with_dot.png";
var [filename, extension] = str.split('.')
   .reduce((acc, val, i, arr) => (i == arr.length - 1) 
       ? [acc[0].substring(1), val] 
       : [[acc[0], val].join('.')], [])


console.log({filename, extension});

// {
//   "filename": "filename.with_dot",
//   "extension": "png"
// }

এটি আইই 11 তে কাজ করছে না
গোকুল মাহা

আপনি IE 11
Boehm_s

2

একটি ওয়ান লাইন সমাধান যা ক্যোয়ারী প্যারাম এবং ইউআরএল-এর কোনও অক্ষরের জন্যও অ্যাকাউন্টে থাকবে।

string.match(/(.*)\??/i).shift().replace(/\?.*/, '').split('.').pop()

// Example
// some.url.com/with.in/&ot.s/files/file.jpg?spec=1&.ext=jpg
// jpg

(1) যদি কোনও ফাইলের কোনও এক্সটেনশন না থাকে তবে এটি ফাইলের নামটি ফেরত দেবে। (২) ইউআরএলটিতে যদি কোনও খণ্ড থাকে তবে কোনও প্রশ্নের (উদাঃ page.html#fragment) নয়, এটি ফাইলের প্রসারণ এবং খণ্ডটি ফিরিয়ে দেবে।
জ্যাক

2

এই সহজ সমাধান

function extension(filename) {
  var r = /.+\.(.+)$/.exec(filename);
  return r ? r[1] : null;
}

টেস্ট

/* tests */
test('cat.gif', 'gif');
test('main.c', 'c');
test('file.with.multiple.dots.zip', 'zip');
test('.htaccess', null);
test('noextension.', null);
test('noextension', null);
test('', null);

// test utility function
function test(input, expect) {
  var result = extension(input);
  if (result === expect)
    console.log(result, input);
  else
    console.error(result, input);
}

function extension(filename) {
  var r = /.+\.(.+)$/.exec(filename);
  return r ? r[1] : null;
}


1

ওয়ালাসারের উত্তরটি দুর্দান্ত তবে আরও একটি চেক করা দরকার।

যদি ফাইলটির কোনও এক্সটেনশন না থাকে তবে এটি ফাইলের নামটি এক্সটেনশন হিসাবে ব্যবহার করবে যা ভাল নয়।

আর একবার চেষ্টা কর:

return ( filename.indexOf('.') > 0 ) ? filename.split('.').pop().toLowerCase() : 'undefined';

1

কিছু ফাইলের কোনও এক্সটেনশন থাকতে পারে তা ভুলে যাবেন না:

var parts = filename.split('.');
return (parts.length > 1) ? parts.pop() : '';

1
var file = "hello.txt";
var ext = (function(file, lio) { 
  return lio === -1 ? undefined : file.substring(lio+1); 
})(file, file.lastIndexOf("."));

// hello.txt -> txt
// hello.dolly.txt -> txt
// hello -> undefined
// .hello -> hello

1
fetchFileExtention(fileName) {
    return fileName.slice((fileName.lastIndexOf(".") - 1 >>> 0) + 2);
}

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