2012-03-07 14 views
7

मुझे .ini फ़ाइलों को संपादित करने में सक्षम होना चाहिए (जो मैं parse_ini_file के साथ पढ़ रहा हूं), लेकिन इस तरह से टिप्पणियां और स्वरूपण (लाइन ब्रेक, इंडेंटिंग) संरक्षित है।अच्छे PHP वर्ग जो .ini फाइलों में हेरफेर करते हैं

क्या आप इस तरह की चीजों के लिए अच्छे और अनुकूलित कार्यों वाले किसी भी अच्छे वर्ग को जानते हैं?

+1

क्या आपके पास कुछ नमूना इनपुट और आउटपुट है? –

+0

यह एक मानक आईएनआई फ़ाइल की तरह दिखता है, जैसे php.ini, 4-5 सेक्शन जिनमें कुछ महत्वपूर्ण = मूल्य प्रविष्टियां हैं, उनके अंदर – Alex

+0

इस तरह कुछ संदेह है (PHP के लिए)। मेरे पास एक ['editconfigini.php'] होगा (http://apt.include-once.org/php/), लेकिन यह खंडों को अनदेखा करता है और केवल एक बाध्य कुंजी = मान प्रारूप की परवाह करता है। – mario

उत्तर

4

आप, यह INI फ़ाइल पढ़ता है, और लिखने पर सेटिंग्स को बरकरार रखता है इस से शुरू करने का प्रयास, आप नए प्रविष्टियों को जोड़ने का समर्थन करने के लिए इसे विस्तार करने के लिए होगा सकता है:

class ini { 
    protected $lines; 

    public function read($file) { 
     $this->lines = array(); 

     $section = ''; 

     foreach(file($file) as $line) { 
      // comment or whitespace 
      if(preg_match('/^\s*(;.*)?$/', $line)) { 
       $this->lines[] = array('type' => 'comment', 'data' => $line); 
      // section 
      } elseif(preg_match('/\[(.*)\]/', $line, $match)) { 
       $section = $match[1]; 
       $this->lines[] = array('type' => 'section', 'data' => $line, 'section' => $section); 
      // entry 
      } elseif(preg_match('/^\s*(.*?)\s*=\s*(.*?)\s*$/', $line, $match)) { 
       $this->lines[] = array('type' => 'entry', 'data' => $line, 'section' => $section, 'key' => $match[1], 'value' => $match[2]); 
      } 
     } 
    } 

    public function get($section, $key) { 
     foreach($this->lines as $line) { 
      if($line['type'] != 'entry') continue; 
      if($line['section'] != $section) continue; 
      if($line['key'] != $key) continue; 
      return $line['value']; 
     } 

     throw new Exception('Missing Section or Key'); 
    } 

    public function set($section, $key, $value) { 
     foreach($this->lines as &$line) { 
      if($line['type'] != 'entry') continue; 
      if($line['section'] != $section) continue; 
      if($line['key'] != $key) continue; 
      $line['value'] = $value; 
      $line['data'] = $key . " = " . $value . "\r\n"; 
      return; 
     } 

     throw new Exception('Missing Section or Key'); 
    } 

    public function write($file) { 
     $fp = fopen($file, 'w'); 

     foreach($this->lines as $line) { 
      fwrite($fp, $line['data']); 
     } 

     fclose($fp); 
    } 
} 

$ini = new ini(); 
$ini->read("C:\\php.ini"); 
$ini->set('PHP', 'engine', 'Off'); 
echo $ini->get('PHP', 'engine'); 
$ini->write("C:\\php.ini"); 
+0

धन्यवाद। क्या आप जानते हैं कि मैं टिप्पणी कैसे कर सकता/व्हाइटस्पेस रेगेक्स में नई लाइनें भी शामिल हैं (जैसे खाली नई लाइनें)? – Alex

+0

ps: मैं आपके रेगेक्स को "रिकॉर्ड" टिप्पणियों जैसे केवल अतिरिक्त डेटा, जो मैं ज़ेन कॉन्फ़िगर क्लास द्वारा उत्पन्न कॉन्फ़िगरेशन में प्रीपेड करता हूं, जो बहुत अच्छा है :) – Alex

+0

@Alex: मैं एक प्रश्न चिह्न भूल गया मेरी टिप्पणी regex में, जो "कोलन कुछ भी के बाद" वैकल्पिक बनाना चाहिए। वह कैसे काम करता है? – Martin

5

मैं Zend घटक ढांचे में config writer उपयोग नहीं किया है, लेकिन मैं config पाठक का उपयोग किया है, और यह बहुत विश्वसनीय था। निश्चित रूप से एक लायक होगा।

+0

मैंने कोशिश की और यह वास्तव में अच्छा है, लेकिन लेखक टिप्पणियों को संरक्षित नहीं करेगा, यह सिर्फ एक नई आईएनआई संरचना उत्पन्न करेगा :( – Alex

+0

यदि यह एकमात्र मुद्दा है, तो आप शायद उस सुविधा को हैक कर सकते हैं? बेशक यह बहुत अच्छा होगा अगर ऐसा होगा एक बदलाव ओपन सोर्स संस्करण पर वापस जा सकता है - अगर केवल आप अपने उन्नयन का लाभ उठा सकते हैं - लेकिन मुझे लगता है कि यह फीचर/एपीआई स्थिरता के बारे में ज़ेंड की नीति के बारे में निर्भर करता है। – halfer

+0

या, आप ज़ेंड लेखक वर्ग को उपclass कर सकते हैं आपकी खुद की कक्षा के साथ, टिप्पणी में परिवर्तन शामिल हैं। – halfer

2

PEAR::Config पैकेज टिप्पणी के लिए समर्थन हासिल है , इसलिए मुझे लगता है कि यह उन्हें संरक्षित करता है। शायद यह आपकी जरूरतों को ठीक कर रहा है।

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