PHP, फ़ाइल एक्सटेंशन के बिना फ़ाइल नाम प्राप्त करें


205

मेरा यह PHP कोड है:

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
इसे क्यों ठुकरा दिया गया? जवाब बिल्कुल सही है। pathinfo स्ट्रिंग्स पर काम करता है, इसलिए यह कोई फर्क नहीं पड़ता कि फ़ाइल वास्तव में सर्वर पर है या नहीं।
गॉर्डन

13
यह दुर्भाग्यपूर्ण है कि उन्होंने "बेसनेम" का नाम दिया है, क्योंकि यह विस्तार के साथ पूरा नाम देता है, आधार नाम नहीं।
ऑस्कर

1
@ ऑस्कर यह शब्द का सबसे व्यापक रूप से समझा जाने वाला अर्थ है basename। कोई गलतफहमी नहीं।
नवफ़ल

1
यह बहुत उपयोगी है, खासकर जब आपको इसे निकालने के लिए फ़ाइल एक्सटेंशन को जानने की आवश्यकता नहीं होती है।
वाहिद अमीरी

यह एक अत्यंत सुरुचिपूर्ण समाधान है। कुडोस। इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए।
देशी कोडर

199

एक विकल्प के रूप में pathinfo(), आप उपयोग कर सकते हैं

  • basename() - पथ का फ़ाइल नाम घटक देता है

PHP मैनुअल से उदाहरण

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

आपको अग्रिम में इसे हटाने के लिए विस्तार जानना होगा।

हालाँकि, चूंकि आपके प्रश्न से आपको विस्तार और आधार प्राप्त करने की आवश्यकता होती है , इसलिए मैं Pekka के उत्तर को सबसे उपयोगी एक के रूप में वोट करूंगा, क्योंकि यह आपको किसी भी जानकारी देगा जो आप एक ही मूल के साथ पथ और फ़ाइल के बारे में चाहते हैं। समारोह।


1
क्या होगा अगर मुझे फाइल एक्सटेंशन के बारे में नहीं पता है .. तो बताइए कि क्या पथ डायनेमिक है किसी भी प्रकार की फाइल एक्सटेंशन इसमें आ सकती है !! फिर क्या ??
user889030

@ user889030 तब आपके पास ओपी की तुलना में एक अलग परिदृश्य है और उपयोग नहीं करते हैं basename, लेकिन pathinfoजैसा पृष्ठ पर दिखाया गया है।
गॉर्डन

72

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

pathinfo($path, PATHINFO_FILENAME);

सरल कार्यात्मक परीक्षण: https://ideone.com/POhIDC


यह एक्सटेंशन के साथ फ़ाइल नाम
लौटाएगा

2
@ user966939 Mhh, एक्सटेंशन के साथ नहीं ; basename;-)
yckart

खैर, किसी भी तरह, वह विस्तार के बिना एक समाधान के लिए पूछ रहा था। ;)
user966939

2
@ user966939, यार कोई विस्तार नहीं है। यह PATHINFO_FILENAMEनहीं है PATHINFO_EXTENSION ....
Pacerier

20
जिसने भी यह तय किया कि filenameउसके पास कोई विस्तार नहीं है जबकि basenameउसके पास कुछ दुखद प्रवृत्तियाँ होनी चाहिए ...
मार्क

12

एक और दृष्टिकोण नियमित अभिव्यक्ति का उपयोग करके है।

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

यह अंतिम अवधि .तक स्ट्रिंग के अंत तक हटा देता है ।


मुझे यह उत्तर पसंद है, बहुत सरल और काम करता है जब आप एक्सटेंशन नहीं जानते हैं।
relipse

विस्फोट का उपयोग करने की तुलना में बहुत बेहतर है, और केवल अंतिम अवधि अनुभाग को पकड़ता है जब आपने फ़ाइल नामों में अवधि का उपयोग किया था
किवीज़ूम

7
नहीं , यह बहुत बुरा है। लोगों को परेशान करना बंद करो।
पचेरियर

धन्यवाद, और उपरोक्त टिप्पणियों ने इसे परेशान किया। विस्तार का पता न होना इसे और उपयोगी बनाता है।
जेम्स टेलर

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"

PHP MAN फंक्शन pathinfo


कृपया इसके लिए php मैन पेज को एक लाइक प्रदान करें pathinfo। यह ओपी को ShowFileExtensionविधि को बेहतर बनाने में मदद करने वाला है और इस उत्तर को खोजने की कोशिश करने वाले किसी भी व्यक्ति के लिए अतिरिक्त रीडिंग प्रदान करेगा। इसके अलावा थोड़ा सा विवरण भटक नहीं जाएगा ...
माइकल कॉक्सन

1
मैंने इस प्रश्न का उत्तर पहले से ही दिए गए समाधान के साथ, ~ 2 साल पहले तुम्हारा;)
yartart

@ सच का पालन करें, लेकिन यह जवाब के भीतर कई उदाहरण देता है। आपके पास ideone.com से लिंक करने का लाभ है, लेकिन साइट ऑफ़लाइन जा सकती है।
एडम एलसोदेनी

7

यदि आप विस्तार जानते हैं तो @Gordon बेसन ठीक काम करेगा, यदि आप न ही विस्फोट का उपयोग कर सकते हैं:

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

1
कृपया मेरे उत्तर के नीचे टिप्पणी समारोह के साथ मुझे सीधे टिप्पणी दें। इसके लिए सबसे उपयुक्त कार्य है pathinfo, यही कारण है कि मैंने basenameकेवल एक विकल्प के रूप में दिया । pathinfoरेगेक्स या के साथ प्रबलित करने की कोई आवश्यकता नहीं है explode
गॉर्डन

4
@fire, आपके अपडेट का कोई मतलब नहीं है। end(explode(".", $file));आपको विस्तार देता है, फ़ाइल नाम नहीं।
पचेरियर

7

लगभग सभी उपरोक्त समाधान में चर $ मार्ग से फ़ाइल नाम प्राप्त करना दिखाया गया है

नीचे स्निपेट को बिना एक्सटेंशन के वर्तमान निष्पादित फ़ाइल नाम मिलेगा

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

व्याख्या

$ _SERVER ['SCRIPT_NAME'] में वर्तमान स्क्रिप्ट का पथ शामिल है।


7

बहुत सारे कोड लिखने की आवश्यकता नहीं है। यहां तक ​​कि यह सिर्फ एक पंक्ति के कोड के द्वारा किया जा सकता है। यहाँ देखें

नीचे एक लाइन कोड दिया गया है, जो केवल फ़ाइल नाम देता है और एक्सटेंशन नाम हटाता है:

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

यह छपेगा

logo

स्रोत: एक्सटेंशन निकालें और PHP में केवल फ़ाइल नाम लौटाएँ


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.

Btw .: आपके पास एक टाइपो है$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
रोहन Khude

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 में फ़ाइल एक्सटेंशन को छिपाने के लिए सही समाधान के नीचे है।

<?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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.