पथ

2010-07-19 16 views
11

से फ़ाइल नाम निकालें मुझे फ़ाइल पथ स्ट्रिंग से फ़ाइल नाम प्राप्त करने की आवश्यकता है। उदाहरण के लिए, इस स्ट्रिंग \abc\def\filename.txt से मैं filename.txtपथ

पाने के लिए regexp के साथ ऐसा करने की कोशिश कर की जरूरत है:

$filepath="abc\filename.txt"; 
$filename = preg_replace("/.+\\/","",$filepath); 

लेकिन यह मुझे एक त्रुटि देता है। इसे हल करने के लिए मुझे किस रेगेक्स का उपयोग करना चाहिए?

+0

कुछ भी नहीं preg_replace उपयोग करने के साथ पात्रों को बदलने के लिए कोई कारण नहीं है: यहाँ एक बैकस्लैश संस्करण है। इसके बजाय preg_match का उपयोग करने के लिए यह अधिक प्रत्यक्ष है। (कैसे मेरा जवाब देखें)। –

उत्तर

33

आप समारोह basename बजाय का उपयोग करना चाहिए महत्वपूर्ण नोट, आप की जरूरत है जब आप अपने तारों में बैकस्लैश करते हैं तो अन्य उद्धरणों का उपयोग करें, अन्यथा es उन्हें ठीक से केप।

ध्यान दें: इस नहीं होगा काम:

$filepath = "abc\filename.txt"; 
$filename = basename($filepath); 

क्योंकि आप कर रहे हैं चर $ filepath वास्तव में रखती है:

abc[special char here equalling \f]ilename.txt

एक और संपादित करें: इस regex भी काम करता है ..

$filepath = '\def\abc\filename.txt'; 
$basename = preg_replace('/^.+\\\\/', '', $filepath); 

जो आपके मूल के साथ गलत था, वह था कि आपके पास सिंगल के बजाय डबल-कोट्स थे, और बैकस्लैश को डबल से बचने की आवश्यकता होती है (\\ \ "की बजाय।

+0

@nathan: यह काम नहीं करेगा, यह आपको 'abcilename.txt' – Sarfraz

+0

@sAc देगा: यह मेरे लिए पूरी तरह से काम करता है। – casablanca

+0

@ कैसाब्लांका: आइए उम्मीद करते हैं कि अन्य लोग भी उस कोड को आजमाएं :) हालांकि मेरे लिए काम नहीं लग रहा है। – Sarfraz

3

यह करना चाहिए:

$filepath='abc\filename.txt'; 
$basename = preg_replace('/^.+[\\\\\\/]/', '', $filepath); 
echo $basename; 

परिणाम:

$filepath = 'abc\filename.txt'; 
$filename = basename($filepath); 

संपादित करें:

filename.txt 
+0

जो फ़ाइलपैथ '\ abc \ def \ filename.txt' के लिए काम नहीं करेगा, यह 'def \ filename.txt' – nathan

+0

@nathan वापस आ जाएगा: मुझे विश्वास है कि समस्या' \\ 'में थी, यह ठीक/रास्ते में – Sarfraz

3

दो समाधान:

  1. preg_match()
  2. pathinfo()

1 के साथ str_replace(): preg_match()

ठीक है, तो समस्या यह है कि आप बैकस्लाश का उपयोग कर रहे हैं। आपको यह सुनिश्चित करना होगा कि अपने फ़ाइलपैथ को परिभाषित करने के लिए डबल कोट्स का उपयोग न करें, क्योंकि बैकस्लैश को एस्केप अनुक्रम के रूप में व्याख्या किया गया है। एकल उद्धरण का प्रयोग करें।

इसके अतिरिक्त, एक regex के साथ, यह बहुत सरल मार्ग के पीछे से आगे बढ़ जब तक आप एक बैकस्लैश हिट द्वारा एक फ़ाइल नाम पाने के लिए है .... चाल .. कि एक बैकस्लैश \\\\ है here's why

अंत में , आप preg_replace का उपयोग नहीं करना चाहते हैं।बस preg_match साथ फ़ाइल नाम ढूंढने:

<?php 
    // Use single quotes or the backslash will be interpreted as an esacpe sequence 
$filepath = '\abc\def\filename.txt'; 

    // You have to use 4 backslashes to represent your single backslash 
    // The regex picks the characters that are NOT \ from the end of the path 
$pattern = '/[^\\\\]+$/'; 

    // Use $matches to store the match 
preg_match($pattern, $filepath, $matches); 

    // Display answer now, or use later 
echo $matches[0]; 
?> 

2: str_replace()pathinfo()

के रूप में अन्य लोगों ने कहा के साथ, basename() एक अच्छा विकल्प है। एक अन्य विकल्प, यदि आपको कोई समस्या है कि आपको बाद में निर्देशिका या अन्य पथ जानकारी की आवश्यकता हो तो लाइन के नीचे pathinfo()

समस्या यह है कि बेसिनम और पथिनोफो दोनों आगे स्लेश मानते हैं, इसलिए आपको अपनी बैकस्लैश को आगे बढ़ाना होगा स्लैश:

उदाहरण:

<?php 
    // Make sure to use single quotes 
$filepath='abc\filename.txt'; 
    // Replace backslash with forward slash 
$filepath = str_replace('\\', '/', $filepath); 
$path_parts = pathinfo($filepath); 

    // This is the answer you want 
echo $path_parts['basename'], "\n"; 

    // But you also have access to these 
echo $path_parts['dirname'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; // since PHP 5.2.0 
?> 
+0

वह या तो काम नहीं करेगा, उसे रेगेक्स समाधान की आवश्यकता है जैसा कि उसके द्वारा इंगित किया गया है। – Sarfraz

+0

@ एसएसी मैंने सोचा कि ओपी ने संकेत दिया है कि रेगेक्स बहुत अच्छी तरह से काम नहीं कर रहा था ... gtg लेकिन कुछ –

+0

में कोशिश करेगा यह केवल तभी काम करता है जब आप पथ में बैकस्लैश के बजाय स्लैश (/) का उपयोग करते हैं। +1 अब :) – Sarfraz

1
preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt 
0

क्यों इस तरह के एक साधारण सी समस्या पर regex फेंक?

$source = "/i/am/a/path.txt"; 
$pos = strrpos($source, '/'); 
$result = substr($source, $pos === FALSE ? 0 : $pos); 

संपादित करें: मैंने यह कोशिश नहीं की है - मेरे पास एक काम करने वाला PHP सर्वर आसान नहीं है। सबस्ट्र और स्ट्रॉप्स के साथ एक-एक-एक त्रुटि हो सकता है, लेकिन यदि ऐसा है तो आप $pos से केवल एक को जोड़ या घटाएं।

EDIT2:

$source = "\\i\\am\\a\\path.txt"; 
$pos = strrpos($source, '\\'); 
$result = substr($source, $pos === FALSE ? 0 : $pos); 
+1

ओपी में बैकस्लाश है, इसलिए आप $ स्रोत उद्धृत नहीं कर सकते हैं और आपको बैकस्लैश से $ pos –

+0

@ पीटर में भागना होगा: बैकस्लैश संस्करण जोड़ा गया। –

संबंधित मुद्दे