2014-05-09 12 views
5

मैं किसी फ़ंक्शन में फ़ाइल नाम पुनः प्राप्त करता हूं। मैं अन्य फाइलों से इस फ़ाइल (फ़ाइल नाम से) जैसी सभी फाइलों को वापस करना चाहता हूं। मैंने यह लिखा:ग्लोब फ़ंक्शन में RegEx पैटर्न

$thumbDir = $this->files_path.'thumbs/'; 
    $toglob = $thumbDir.pathinfo($name, PATHINFO_FILENAME).'_[0-9]+\x[0-9]+_thb.'.pathinfo($name, PATHINFO_EXTENSION); 
    foreach (glob($toglob) as $key => $value) { 
     echo $value; 
    } 

लेकिन यह काम नहीं करता है।

oldFileName_[one or more digits]x[one or more digits]_thb.oldFileNameExtension 

मैं अगर किसी को मेरी मदद इस के साथ :)

उत्तर

11

glob() वास्तव में एक अर्ध regex इंजन है बहुत आभारी हो जाएगा: मैं फ़ाइलों को जो उनके फ़ाइल नाम है खोज करते हैं। डॉक्स पर एक टिप्पणी से, यह एक ? और एक * अनुमति देता है:

ग्लोब दो विशेष प्रतीकों कि एक मेटा-चरित्र और एक परिमाणक के बीच एक मिश्रण की तरह की तरह कार्य करता है। ये दो अक्षर * हैं और?

? किसी भी चरित्र का 1 से मेल खाता है एक/

को छोड़कर * एक/

यदि यह मदद करता है को छोड़कर 0 या किसी चरित्र का अधिक से मेल खाता है, के PCRE समकक्ष के रूप में * के बारे में सोच। * और? डॉट के PCRE समकक्ष के रूप में (।)

इसका मतलब है आप glob() में अपनी अभिव्यक्ति _[0-9]+\x[0-9]+_thb. उपयोग नहीं कर सकते। इसके बजाय, आप पूरी निर्देशिका में देखने के लिए और अगर यह preg_match() साथ मेल खाता देख सकते हैं:

$glob = glob('/path/to/dir/*'); 
foreach($glob as $file) { 
    if(preg_match('/_\d+x\d+_thb\./', $file)) { 
     // Valid match 
     echo $file; 
    } 
} 

एहसास है कि glob(/path/to/dir/*); में, * से मेल नहीं खाता एक / तो यह उप-निर्देशिकाओं के किसी भी फाइल नहीं मिलेगा। यह केवल उस पथ में प्रत्येक फ़ाइल और निर्देशिका के माध्यम से लूप होगा; यदि आप गहरे जाना चाहते हैं, तो आपको एक पुनरावर्ती कार्य करना होगा।

नोट मैं साफ कर अपने expression:

_\d+x\d+_thb\. 

\d लगभग बराबर होती है [0-9] (यह भी अरबी अंकों वर्ण, आदि शामिल हैं), तो आपको x से बचने के लिए (ताकि कोई \x) की जरूरत नहीं है, और आप करना चाहते हैं अवधि से बचें (\.)।

+2

अरे, यह मेरी ग्लोब टिप्पणी है जिसे आपने उद्धृत किया है, मेरा दिन बनाया गया है, hoozah! :) –

+1

@ क्रेओनियोलेंट हाहा भयानक, यह मैंने देखा है कि बेहतर PHP दस्तावेज़ टिप्पणियों में से एक था - बहुत अच्छी तरह से upvotes था। यदि आप इस प्रश्न में ठोकर खाएंगे तो आपको 'ग्लोब()' व्यक्ति होना चाहिए;) – Sam

+0

प्रतिक्रिया के लिए धन्यवाद :) – user3025978

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