2010-03-26 8 views
36

मैं एक निर्देशिका में सभी CSV फ़ाइलों चाहते हैं, तो मैंक्या PHP के ग्लोब() को केस को असंवेदनशील तरीके से ढूंढने के लिए बनाया जा सकता है?

glob('my/dir/*.CSV') 

इस का उपयोग लेकिन एक लोअरकेस सीएसवी विस्तार के साथ फ़ाइलें नहीं मिल रहा है।

मैं

glob('my/dir/*.{CSV,csv}', GLOB_BRACE); 

इस्तेमाल कर सकते हैं लेकिन वहाँ सभी मिश्रित मामले संस्करणों की अनुमति देने के लिए एक रास्ता है? या यह सिर्फ glob() की सीमा है?

glob('my/dir/*.[cC][sS][vV]') 
+0

सिर्फ एक नोट है कि 'glob() 'वास्तव में विंडोज (और संभवतः अन्य असंवेदनशील फ़ाइल सिस्टम) में असंवेदनशील है। –

+0

सच नहीं है। 'ग्लोब ("*। सीएसवी")' केवल अपरकेस फाइलें पायेगा, जबकि 'ग्लोब ("*। सीएसवी")' केवल लोअरकेस फाइलें पायेगा। --- php 5.3.8 – Radon8472

उत्तर

47

Glob पैटर्न का समर्थन चरित्र पर्वतमाला कर सकता है। हाँ यह बदसूरत है।

+1

लेकिन क्या यह "सीएसवी" या "सीएसवी" में समाप्त होने वाली किसी भी फ़ाइल से मेल नहीं खाएगा? लेकिन यह एक साइडपॉइंट है: जो मैं खोज रहा हूं वह एक पैटर्न है जो किसी भी मामले में सभी छवि फ़ाइलों से मेल खाता है (जेपीजी, जेपीजी, पीएनजी, पीएनजी, आदि)। – JohnK

+3

@ जॉनक: "लेकिन क्या सभी मिश्रित केस संस्करणों को अनुमति देने का कोई तरीका है?" –

27

आप इस

$files = glob('my/dir/*'); 

$csvFiles = preg_grep('/\.csv$/i', $files); 
+0

के साथ windows7 में परीक्षण किया गया बहुत साफ और लचीला। – concept

+2

सहमत हैं। ऐसा लगता है कि आप चरित्र श्रेणियों के साथ GLOB_BRACE को गठबंधन नहीं कर सकते हैं, इसलिए मैंने एक बार में कई फ़ाइल स्वरूपों की केस असंवेदनशील खोज करने के लिए glob + preg_grep का उपयोग कर समाप्त कर दिया। पारितोषिक के लिए धन्यवाद! –

+0

यह सबसे उपयोगी समाधान आईएमओ है। – Jonathan

5

glob('my/dir/*.[cC][sS][vV]') यह करना चाहिए:

0

आप अपना खुद का केस असंवेदनशील ग्लोब लिख सकते हैं। यह एक व्यक्तिगत वेब पुस्तकालय से है मैं लिखने:

/** PHP has no case insensitive globbing 
* so we have to build our own. 
* 
* $base will be the initial part of the path which doesn't need case insensitive 
* globbing. 
* Suffix is similar - it will not be made insensitive 
* Make good use of $base and $suffix to keep $pat simple and fast in use. 
*/ 
    function ciGlob($pat, $base = '', $suffix = '') 
    { 
     $p = $base; 
     for($x=0; $x<strlen($pat); $x++) 
     { 
      $c = substr($pat, $x, 1); 
      if(preg_match("/[^A-Za-z]/", $c)) 
      { 
       $p .= $c; 
       continue; 
      } 
      $a = strtolower($c); 
      $b = strtoupper($c); 
      $p .= "[{$a}{$b}]"; 
     } 
     $p .= $suffix; 
     return glob($p); 
    } 
2

लिए आप फ़ाइलों को फ़िल्टर कर सकते हैं उन सभी को

foreach(glob('my/dir/*') as $file){ 
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); 
    if(!in_array($ext, array('csv'))){ 
     continue; 
    } 
    ... do stuff ... 
} 

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

0

मैंने एक फ़ंक्शन के बारे में सुना है जिसका उपयोग इस तरह किया जा सकता है: कोशिश करें कि यह आपके लिए काम करता है या नहीं!

<?php 
$pattern = sql_regcase("*.txt"); 
glob($pattern); 
?> 
+0

दिलचस्प। हालांकि इसका उपयोग बहिष्कृत कर दिया गया है। – alex

-1

यह सब एक्सटेंशन के साथ काम करने के लिए उपयोग करें:

$extension = 'some_extension'; 
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper($1).strtolower($1).']'", $extension)); 
+0

डाउनवोट क्यों? –

+1

मैं आपसे जो भी नीचे मतदान करता हूं, उसके लिए मैं बात नहीं कर सकता, लेकिन कुछ (उम्मीदवार सहायक) अंक: (1) आपकी पथ स्ट्रिंग में '''' और (2) पीसीआरई 'ई' (eval) ध्वज गुम है PHP 5.5 के रूप में बहिष्कृत किया गया है और 7 में हटा दिया गया है, जिनमें से दोनों इस उत्तर से पुराने हैं। इसका उपयोग निराश है। – cautionbug

+0

'preg_replace()' की जरूरत नहीं है। आप 'विस्फोट() ',' नक्शा() ', केस प्रकारों को वापस कर सकते हैं और फिर' शामिल()'। – alex

0

एकाधिक फ़ाइलों के साथ ग्लोब के लिए इस लिंक को आया। हालांकि यह ओपी के साथ मदद नहीं करता है, यह दूसरों को यहां समाप्त करने में मदद कर सकता है।

$file_type = 'csv,jpeg,gif,png,jpg'; 
$i = '0'; 
foreach(explode(",",$file_type) as $row){ 
    if ($i == '0') { 
     $file_types = $row.','.strtoupper($row); 
    } else { 
     $file_types .= ','.$row.','.strtoupper($row); 
    } 
    $i++; 
} 

$files = glob($dir."*.{".$image_types."}",GLOB_BRACE); 
+0

'$ i'' 0'' 'के रूप में? क्यूं कर? – alex

+0

0 सरणी – user3058870

+0

में पहला तत्व है मेरा मतलब है, आप इसे लूप इंडेक्स के रूप में उपयोग कर रहे हैं, लेकिन इसे एक स्ट्रिंग के रूप में परिभाषित कर रहे हैं। – alex

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