स्ट्रिंग से एक्सटेंशन कैसे निकालें (केवल वास्तविक एक्सटेंशन!)


135

मैं एक छोटे से फंक्शन की तलाश में हूं, जो मुझे फाइल नाम से एक्सटेंशन हटाने की अनुमति देता है।

मैंने गुग्लिंग द्वारा कई उदाहरण पाए हैं, लेकिन वे खराब हैं, क्योंकि वे स्ट्रिंग का हिस्सा "" के साथ हटा देते हैं। । वे सीमक के लिए डॉट का उपयोग करते हैं और बस स्ट्रिंग को काटते हैं।

इन लिपियों को देखें,

$from = preg_replace('/\.[^.]+$/','',$from);

या

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

जब हम स्ट्रिंग को इस तरह से जोड़ते हैं:

यह सोमेस्ट्रिंग का उदाहरण है

यह केवल "यह" वापस आएगा ...

विस्तार में 3 या 4 वर्ण हो सकते हैं, इसलिए हमें यह जांचना होगा कि क्या डॉट 4 या 5 स्थिति पर है, और फिर इसे हटा दें।

यह कैसे किया जा सकता है?


1
"वास्तविक" एक्सटेंशन क्या है? आप पिछले 4 या les char को हटाना चाहते हैं यदि वे एक बिंदु से आगे हैं?
clyfe

"Col. Shrapnel" - यह विंडोज उपयोगकर्ताओं के लिए डिज़ाइन किया गया है। "clyfe" - हाँ, मैं डॉट के बाद सब कुछ निकालना चाहता हूं, लेकिन केवल अगर यह 4 या 5 स्थिति पर है, तो क्या ".jpeg" या ".mp3" का प्रतिनिधित्व करेगा। मैं इसे हटा नहीं सकता। मुझे पता है कि अगर मैं स्टेटमेंट का उपयोग करके स्ट्रैट-पॉस और कट स्ट्रिंग का उपयोग कर सकता हूं (यदि 5 पॉस = डॉट तो राइट 5 चार्ट से कट (आरटीआरएम), यदि 4 पॉश = डॉट तो आरटीएम 4, और फिर बिना किसी संशोधन के वापस आ जाएं।) शायद यह तेजी से समाधान है।
मार्क

3
.Package फ़ाइलों के बारे में क्या? या? 4 वर्णों के विस्तार को प्रतिबंधित करने के लिए थोड़ा मनमाना लगता है।
rdb

जवाबों:


172

इसको आजमाओ:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

तो, यह तीन या चार वर्णों के बाद एक बिंदु से मेल खाता है जो एक बिंदु या एक स्थान नहीं है। "3 या 4" नियम को शायद आराम करना चाहिए, क्योंकि बहुत सारे फ़ाइल एक्सटेंशन हैं जो छोटे या लंबे हैं।


समस्या यह है कि ऐसे लोग भी हैं जो फाइलों का नाम बदलते हैं:20120720.something.somethingelse.jpg
ओबेरम क्रोनन

3
मुझे नहीं लगता कि यह एक्सटेंशन के रूप में दो पात्रों के साथ फाइलों के साथ काम करेगा
प्राकृतिकबॉर्नकेपर

1
Ty! कृपया ध्यान दें कि यदि आप चर प्रतिस्थापन का प्रदर्शन नहीं करते हैं तो आपको एकल उद्धरणों का उपयोग करना चाहिए जैसे"$var"
aelgoa

ठीक है, .py फ़ाइलों के साथ इसका उपयोग करने के लिए मुझे लगता है कि आपको केवल 3,4 के बजाय 2,3,4 जोड़ना होगा:> धन्यवाद!
वोगदेव

2
@voghDev को 2 से 4 वर्णों के साथ एक्सटेंशन का समर्थन करना चाहिए, {2,4}{3,4}
जिनके


81

मैनुअल से, pathinfo :

<?php
    $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"; // Since PHP 5.2.0
?>

इसे ठीक से संचालित करने के लिए पूर्ण पथ होना आवश्यक नहीं है। यह बस के रूप में खुशी से पार्स के file.jpgरूप में होगा /path/to/my/file.jpg


मैंने पहले ही यह जाँच कर ली। ऊपर की तरह ही गलती। T.sec से "$ path_parts ['फ़ाइल नाम'] तक पहुँचने का प्रयास करें -" xxx "23 12 32 32 a twym2 यह केवल T लौटेगा। ऊपर के उदाहरण से इसे कुछ भी नहीं निकालना चाहिए!
मार्क

56

PHP बेसनेम () का उपयोग करें

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

आउटपुट: स्ट्रिंग (4) "परीक्षण"


2
+1 यदि किसी एक्सटेंशन के लिए उल्लिखित आवश्यकताएं सख्त नहीं थीं, तो यह सही उत्तर होगा।
कायला

1
Php.net पर कमिट्स को देखते हुए एक एरे के साथ काम करने के बारे में एक विचार है ... जो मुझे लगता है कि एरे-वॉक
CrandellWS

35

यह एक आसान समाधान है और कोई बात नहीं कितनी देर तक विस्तार या स्ट्रिंग में कितने डॉट्स या अन्य वर्ण हैं।

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

मूल रूप से यह सिर्फ अंतिम घटना के लिए दिखता है। और फिर उस बिंदु तक सभी वर्णों को पुनः प्राप्त करने के लिए विकल्प का उपयोग करता है।

यह आपके googled उदाहरणों में से एक के समान है, लेकिन नियमित अभिव्यक्तियों और अन्य उदाहरणों की तुलना में सरल, तेज और आसान है। वैसे भी imo आशा है कि यह किसी की मदद करता है।


2
मुझे पता है कि यह बहुत देर से आ रहा है, लेकिन मुझे लगता है कि यह सबसे अच्छा जवाब है। बहुत अच्छा काम करता है।
आगबोगी माइकल

उदाहरण के लिए बिना विस्तार के छिपी फ़ाइलों के लिए यह काम नहीं करेगा.htaccess
Fr0zenFyr

12

आप PHP का उपयोग कर सकते हैं जो सहायता के लिए बनाया गया है ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

यद्यपि यदि आप केवल एक फ़ाइल नाम ( .somefile.jpg) के साथ काम कर रहे हैं , तो आपको मिलेगा ...

./somefile

इसे CodePad.org पर देखें

या रेगेक्स का उपयोग करें ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

इसे CodePad.org पर देखें

यदि आपके पास कोई रास्ता नहीं है, लेकिन सिर्फ एक फ़ाइल नाम है, तो यह काम करेगा और बहुत तनाव में होगा ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

इसे CodePad.org पर देखें

बेशक, ये दोनों केवल अंतिम अवधि ( .) की तलाश में हैं।


जैसा कि समाधान की अंतिम पंक्ति में उल्लेख किया गया है, यह फ़ाइल नाम के लिए असफल होगा जैसे.htaccess
Fr0zenFyr

8

निम्न कोड मेरे लिए अच्छी तरह से काम करता है, और यह बहुत छोटा है। यह केवल डॉट्स द्वारा सीमांकित सरणी में फ़ाइल को तोड़ता है, अंतिम तत्व (जो काल्पनिक रूप से विस्तार है) को हटाता है, और डॉट्स के साथ फिर से सरणी को सुधारता है।

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

यदि फ़ाइल में कोई एक्सटेंशन या रिक्त नहीं है तो झूठा वापस आ जाएगा यदि फ़ाइल है.htaccess
Timo Huovinen

5

मुझे Google पर कई उदाहरण मिले लेकिन बुरे हैं क्योंकि "" के साथ स्ट्रिंग को हटा दें।

वास्तव में यह बिल्कुल सही बात है। आगे बढ़ो और उस का उपयोग करें।

फ़ाइल एक्सटेंशन अंतिम बिंदु के बाद सब कुछ है, और किसी विशेष वर्ण की संख्या के लिए फ़ाइल एक्सटेंशन की कोई आवश्यकता नहीं है। यहां तक ​​कि केवल विंडोज के बारे में बात करते हुए, यह पहले से ही फ़ाइल एक्सटेंशन के साथ आता है जो 3-4 वर्णों, जैसे कि फिट नहीं होते हैं। .manifest


2
..और चलो .htaccessऔर .htpasswdअपाचे वातावरण में मत भूलना ।
h2ooooooo

5

उपयोग की सलाह देते हैं: pathinfo साथ PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

4

इसे करने के कुछ तरीके हैं, लेकिन मुझे लगता है कि एक तेज तरीका निम्नलिखित है

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

एक और उपाय यह है। मैंने इसका परीक्षण किया, लेकिन ऐसा लग रहा है कि इसे एक फ़ाइलनाम में कई अवधियों के लिए काम करना चाहिए

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

इसके अलावा:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

इन सभी में, $nameएक्सटेंशन के बिना फ़ाइल नाम शामिल है


4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

आउटपुट:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);फ़ाइल का एक्सटेंशन प्राप्त करने के लिए उसे जोड़ें।
I_ATE_YOUR_WORK_FILES

2

जैसा कि अन्य उल्लेख करते हैं, कुछ निश्चित वर्णों तक विस्तार को सीमित करने का विचार अमान्य है। Array_pop के विचार के साथ एक सरणी के रूप में एक सीमांकित स्ट्रिंग के बारे में सोचते हुए, यह फ़ंक्शन मेरे लिए उपयोगी रहा है ...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

उपयोग:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

आउटपुट:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

कार्रवाई में:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0


1

आप {x,y}ऑपरेटर का उपयोग करके नियमित अभिव्यक्ति पैटर्न की लंबाई निर्धारित कर सकते हैं । {3,4}मैच होगा यदि पूर्ववर्ती पैटर्न 3 या 4 बार होता है।

लेकिन मुझे नहीं लगता कि आपको वास्तव में इसकी आवश्यकता है। "This.is" नामक फ़ाइल का आप क्या करेंगे?


0

इसे इस्तेमाल करो:

strstr('filename.ext','.',true);
//result filename

यह केवल तभी काम करता है जब फ़ाइल नाम की अवधि पहले से न हो। पीएचपी डॉक्स की सुई पहली घटना का उल्लेख
relipse

0

इस एक का उपयोग करने की कोशिश करो। यह निश्चित रूप से फ़ाइल एक्सटेंशन को हटा देगा।

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'

आप इसे array_pop ()
पीटर ब्रांड

0

संपादित करें : स्मार्ट दृष्टिकोण IMHO, यह अंतिम बिंदु और निम्नलिखित पाठ को हटा देता है फ़ाइल को एक फ़ाइल नाम (एक्सटेंशन उर्फ) से :

$name = basename($filename, '.' . end(explode('.', $filename)));

चीयर्स;)


जबकि यह काम कर सकता है, end()पैरामीटर के रूप में पारित फ़ंक्शन के साथ काम करने वाला नहीं है। यह एक नोटिस भी पैदा करता है: केवल चर को संदर्भ द्वारा पारित किया जाना चाहिए
कोडब्राउर

0

यह तब काम करता है जब एक एक्सटेंशन के कई हिस्से होते हैं और दोनों छोटे और कुशल होते हैं:

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