পিএইচপি, ফাইল এক্সটেনশন ছাড়াই ফাইলের নাম পান


205

আমার এই পিএইচপি কোড রয়েছে:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

যদি আমার কাছে কোনও ফাইল থাকে তবে my.zipএই ফাংশনটি ফিরে আসে .zip

আমি বিপরীতটি করতে চাই my, এক্সটেনশন ছাড়াই ফাংশনটি ফিরে আসতে চাই ।

ফাইলটি ভেরিয়েবলের কেবল একটি স্ট্রিং।


উত্তর:


397

এত কিছুর দরকার নেই। পরীক্ষা করে দেখুন pathinfo () , আপনার আপনার পাথ সব উপাদান দেয়।

ম্যানুয়াল থেকে উদাহরণ:

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

কোডের আউটপুট:

/www/htdocs
index.html
html
index

এবং বিকল্পভাবে আপনি কেবলমাত্র কিছু নির্দিষ্ট অংশ পেতে পারেন:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3
কেন এই হ্রাস করা হয়েছিল? উত্তরটি একেবারে সঠিক। প্যাথিনফো স্ট্রিংগুলিতে অপারেট করে, তাই ফাইলটি সার্ভারে আসলে আছে কিনা তাতে কিছু যায় আসে না।
গর্ডন

13
দুর্ভাগ্যজনক যে তারা "বেসনেম" ভুল নাম দিয়েছে, যেহেতু এটি পুরো নামটি এক্সটেনশন সহ ফিরিয়ে দেয়, বেস নামটি নয়।
অস্কার

1
@ অস্কার এটি এই শব্দটির সর্বাধিক বিস্তৃত অর্থ basename। কোনও নামকরণ নেই।
নওফাল

1
এটি খুব দরকারী, বিশেষত যখন ফাইলটি এক্সট্র্যাক্ট করার জন্য আপনার প্রয়োজন হয় না।
ওয়াহিদ আমিরি

এটি একটি অত্যন্ত মার্জিত সমাধান। যশ। এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
নেটিভ কোডার

199

এর বিকল্প হিসাবে pathinfo(), আপনি ব্যবহার করতে পারেন

  • basename() - পথের ফাইলের নাম উপাদান দেয়

পিএইচপি ম্যানুয়াল থেকে উদাহরণ

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

যদিও এটি আগে থেকে অপসারণ করতে আপনাকে এক্সটেনশনটি জানতে হবে।

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


1
আমি যদি ফাইল এক্সটেনশান সম্পর্কে না জানি তাহলে .. যদি বলি যে পথটি গতিশীল হয় তবে ফাইলের কোনও প্রকারের এক্সটেনশন এটি আসতে পারে !! তারপর কি ??
ব্যবহারকারী 889030

@ user889030 তারপরে আপনার ওপি থেকে আলাদা পরিস্থিতি রয়েছে এবং ব্যবহার করবেন না basename, তবে pathinfoপৃষ্ঠায় অন্যটি প্রদর্শিত হয়েছে।
গর্ডন

72

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

সাধারণ কার্যকরী পরীক্ষা: https://ideone.com/POhIDC


এটি এক্সটেনশন সহ ফাইলের
নামটি

2
@ user966939 Mhh, এক্সটেনশন সহ কোনও নয় basename;-)
ইয়াকার্ট

ভাল, যেভাবেই হোক না কেন, তিনি এক্সটেনশন ছাড়াই সমাধানের জন্য জিজ্ঞাসা করেছিলেন। ;)
user966939

2
@ user966939, ডুডের মোটেই কোনও এক্সটেনশন নেই। এটি PATHINFO_FILENAME, নয় PATHINFO_EXTENSION ....
প্যাসেরিয়ার 5'15

20
যে কেউ সিদ্ধান্ত নিয়েছে যে filenameতার মেয়াদ বাড়ানোর সময় basenameতার কিছুটা দুঃখজনক প্রবণতা থাকতে হবে ...
মার্ক

12

অন্য পদ্ধতির নিয়মিত এক্সপ্রেশন ব্যবহার করে।

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

এটি .স্ট্রিংয়ের শেষ অবধি শেষ পর্ব থেকে সরিয়ে দেয় ।


আমি এই উত্তরটি খুব পছন্দ করি এবং আপনি যখন এক্সটেনশনটি জানেন না তখন কাজ করে।

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

7
না , এটা অনেক খারাপ। মানুষকে পুনরায় বদ্ধ করা বন্ধ করুন।
পেসিয়ার 16

ধন্যবাদ, এবং উপরের মন্তব্যগুলি এটি পেরেক করেছে। এক্সটেনশনটি জানা না থাকা এটিকে আরও দরকারী করে তোলে।
জেমস টেলর

1
@ caiosm1005, আক্রমণের পৃষ্ঠ তত্ক্ষণাত্ বেড়ে যায় কারণ একটি রেইজেক্স ইঞ্জিনের অভ্যন্তরীণ বিরুদ্ধে তর্ক করা শক্ত। উদাহরণস্বরূপ, উপরের কোডটিতে, এমন কোনও ইনপুট রয়েছে $fileNameযা ইঞ্জিনটিকে ক্ষতিকারক (বা আরও খারাপ) সময়ে চালানোর কারণ হতে পারে তা অদ্ভুত হবে না । এবং ধরে নিই যে আমরা এই নির্দিষ্ট রেইগেক্স ইঞ্জিনের অভ্যন্তরগুলি বিচ্ছিন্ন করে ফেলেছি এবং তাত্ত্বিকভাবে এটি প্রতিটি সম্ভাব্য মান $fileNameহতে পারে তার বিরুদ্ধে শক্তিশালী হিসাবে প্রমাণিত হয়েছে , কোডটি এখনও অন্য প্ল্যাটফর্মের মধ্যে নির্বিচারে বহনযোগ্য নয় যা রেজেক্স ইঞ্জিনটির আরেকটি বাস্তবায়ন রয়েছে।
পেসিয়ার 22

12

যদি এক্সটেনশনটি জানা না থাকে তবে এই সমাধানটি ব্যবহার করুন

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

পিএইচপি মান ফাংশন প্যাথিনফো


দয়া করে এর জন্য পিএইচপি ম্যান পৃষ্ঠাতে একটি পছন্দ সরবরাহ করুন pathinfo। এটি ওপিকে ShowFileExtensionপদ্ধতিটিকে আরও উন্নত করতে সহায়তা করতে চলেছে এবং যে কেউ এই উত্তরটি খুঁজে পেতে চেষ্টা করছে তাদের জন্য অতিরিক্ত পড়ার ব্যবস্থা করবে। এছাড়াও একটি বিবরণ একটি বিভ্রান্ত হবে না ...
মাইকেল কক্সন

1
আমি ইতিমধ্যে একই প্রশ্নের সাথে ইতিমধ্যে এই প্রশ্নের উত্তর দিয়েছি, আপনার 2 বছর আগে;)
ইয়র্ক্ট

@ ইয়াকার্ট সত্য তবে এটি উত্তরের মধ্যে একাধিক উদাহরণ দেয়। আপনার আইডিয়োন ডটকমের সাথে লিঙ্ক করার সুবিধা রয়েছে তবে সাইটটি অফলাইনে যেতে পারে।
অ্যাডাম এলসোডনেই

7

@ গর্ডনের বেসনেমটি এক্সটেনশনটি জানেন, তবে যদি আপনি বিস্ফোরণটি ব্যবহার করতে না পারেন তবে ঠিক কাজ করবে:

$filename = end(explode(".", $file));

1
আমার উত্তরের নীচে মন্তব্য ফাংশন দিয়ে আমার কাছে মন্তব্য সরাসরি করুন। এর জন্য সবচেয়ে উপযুক্ত ফাংশনটি pathinfoহ'ল এজন্য আমি basenameকেবল একটি বিকল্প হিসাবে দিয়েছি । pathinfoরেজেক্স বা পুনরায় উদ্ভাবনের দরকার নেই explode
গর্ডন

4
@ ফায়ার, আপনার আপডেটটি কোন মানে করে না। end(explode(".", $file));ফাইলের নাম নয়, আপনাকে এক্সটেনশন দেয়।
পেসিয়ার 16

7

উপরের প্রায় সমস্ত সমাধানের মধ্যে ভেরিয়েবল-পাথ থেকে ফাইলের নাম প্রদর্শিত হচ্ছে

স্নিপেটের নীচে কোনও এক্সটেনশন ছাড়াই বর্তমান সম্পাদিত ফাইলের নাম পাবেন

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

ব্যাখ্যা

$ _SERVER ['SQLT_NAME'] এ বর্তমান স্ক্রিপ্টের পথ রয়েছে।


7

প্রচুর কোড লেখার দরকার নেই। এমনকি এটি কোডের এক লাইনের মাধ্যমেও করা যেতে পারে। এখানে দেখুন

নীচে একটি লাইন কোড রয়েছে যা কেবলমাত্র ফাইল নামটি দেয় এবং এক্সটেনশন নামটি সরিয়ে দেয়:

<?php
 echo pathinfo('logo.png')['filename'];
?>

এটি মুদ্রণ করবে

logo

উত্স: এক্সটেনশন সরান এবং কেবল পিএইচপি-তে ফাইলের নাম ফেরত দিন


4

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

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

আমার ক্ষেত্রে, আমি নীচে ব্যবহার। আমি এটার এক্সটেনশন কি তা চিন্তা করি না। : ডি আমি মনে করি এটি আপনাকে সাহায্য করবে

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

বিটিডব্লিউ: আপনার টাইপ রয়েছে$extenion
থমাস কেকিসেন

2

আপনি এটি লিখতে পারেন

$filename = current(explode(".", $file));

এইগুলি অ্যারের বর্তমান উপাদানটি ফিরিয়ে দেবে, যদি আগে ব্যবহার না করা হয়।


হ্যালো, প্লিজ ই ডাউনগ্রেড করার আগে চেক করুন। এটি কাজ করছে আমি এটি আমার কোডটিতে বহুবার ব্যবহার করেছি। এই ফাংশনটি ব্যবহার করে আপনি কেবল একটি ফাইলের নাম পেতে পারেন যদি আপনি ফাইল করেন তবে নাম "xyz.jpg"। এটিতে পুরো পথ সম্বলিত ফাইলের নামের সাথে এটি কাজ না করে।
জিতেন্দ্র পাওয়ার

যদি কোনও ফাইলের নামের একাধিক বিন্দু থাকে তবে এটি সঠিকভাবে কাজ করে না, যেমন "some.interesting.image.jpg"
ganzpopp

2

সংক্ষিপ্ত

echo pathinfo(__FILE__)['filename']; // since php 5.2

ভাল. তবে যদি আমি কোডের উপরে রাখি b.phpএবং আমি চালিত a.phpকরে require('b.php')। তারপরে আউটপুটটি কীভাবে bপরিবর্তিত হবেa
রোহান খুদে

1

ফাইল এক্সটেনশন ছাড়াই ফাইলের নাম আপনি যখন সেই এক্সটেনশনটি জানেন না:

$basename = substr($filename, 0, strrpos($filename, "."));


2
এক্সটেনশনটি .tar.gz এর মতো কিছু হলে কী হবে?
আর্দা

1

আপনার যদি কোন এক্সটেনশন রয়েছে তা আপনি যদি না জানেন তবে আপনি এটি চেষ্টা করতে পারেন:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

সমস্ত সম্ভাবনার সাথে কাজ করা:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

আপনার উত্তরটি পিএইচপি-তে ফাইল এক্সটেনশনে আড়াল করার নিখুঁত সমাধানের নীচে।

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

যখন এক্সটেনশনের একাধিক অংশ থাকে তখন বিদ্যমান সমাধানগুলি ব্যর্থ হয়। নীচের ফাংশনটি একাধিক অংশের জন্য কাজ করে, একটি পুরো পথ বা কেবল এএ ফাইল নাম:

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file

0

এই 1 টি সারিতে কোনও এক্সটেনশন ছাড়াই কেবল ফাইলের নামটি দেয়:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.