2011-05-26 11 views
7

मैं एक INI फ़ाइल में निम्नलिखित है:एक INI फ़ाइल में चर नाम के रूप में एक कीवर्ड का उपयोग करना

[country] 
SE = Sweden 
NO = Norway 
FI = Finland 

हालांकि, जब var_dump() ing PHP के parse_ini_file() फ़ंक्शन, मैं निम्नलिखित उत्पादन प्राप्त करें:

PHP Warning: syntax error, unexpected BOOL_FALSE in test.ini on line 2 
in /Users/andrew/sandbox/test.php on line 1 
bool(false) 

ऐसा प्रतीत होता है कि "नहीं" आरक्षित है। क्या कोई अन्य तरीका है जिसे मैं "NO" नामक एक चर सेट कर सकता हूं?

उत्तर

4

एक और हैक होगा अपने मूल्यों के साथ अपनी आईएनआई कुंजी को रिवर्स करें और array_flip का उपयोग करें:

एक
<?php 

$ini = 
" 
    [country] 
    Sweden = 'SE' 
    Norway = 'NO' 
    Finland = 'FI' 
"; 

$countries = parse_ini_string($ini, true); 
$countries = array_flip($countries["country"]); 
echo $countries["NO"]; 

फिर भी आप नहीं (कम से कम) के आसपास उद्धरण चिह्नों का उपयोग करने की आवश्यकता होगी, यदि आप

Norway = NO 

कर आप $ देशों [ "नहीं"] के लिए एक त्रुटि लेकिन मूल्य नहीं मिलता हो जाएगा खाली स्ट्रिंग।

+0

+1 ओह, अच्छा कामकाज :-) – lonesomeday

+1

धन्यवाद, शायद यह करने का एकमात्र तरीका है। –

+0

यदि आपके मान अद्वितीय नहीं हैं तो यह तोड़ नहीं होगा? वे सभी * मूल्य * के बाद हैं, कुंजी नहीं। – Pacerier

-1

मैनुअल पृष्ठ से parse_ini_file के लिए:

आरक्षित शब्द जो INI फ़ाइलों के लिए कुंजी के रूप में नहीं किया जाना चाहिए रहे हैं। इनमें शामिल हैं: शून्य, हाँ, नहीं, सच, झूठा, चालू, बंद, कोई नहीं।

तो नहीं, आप एक चर NO सेट नहीं कर सकते हैं।

+1

वह एक कामकाज की मांग कर रहा है। – Pacerier

2

एक हैक की तरह है, लेकिन आप कुंजी नाम के आसपास बैकटिक जोड़ सकते हैं:

[country] 
`SE` = Sweden 
`NO` = Norway 
`FI` = Finland 

तो उन्हें इतनी तरह का उपयोग:

$result = parse_ini_file('test.ini'); 
echo "{$result['`NO`']}\n"; 

आउटपुट:

$ php test.php 
Norway 
+1

यह वैरिएबल को किसी अन्य चीज़ के नाम बदलने से अलग नहीं है। आपके समाधान के साथ, परिवर्तनीय नाम \ 'NO \' है, नहीं। कॉन्फ़िगरेशन फ़ाइल में 'πNOπ = नॉर्वे' भी कर सकता है। –

0

मुझे यह त्रुटि मिल रही थी जब स्ट्रिंग में एकल कोट संयोजन थे जैसे 'टी या'।

से पहले::

You have selected 'Yes' but you haven't entered the date's flexibility 

के बाद:

"You have selected 'Yes' but you haven't entered the date's flexibility" 
3

यह propably एक छोटे से देर से आता है, लेकिन काम करता है जिस तरह से parse_ini_file PHPs परेशान समस्या से छुटकारा पाने के लिए, मैं दोहरे उद्धरण में स्ट्रिंग लिपटे मुझे इतना इतना है कि मैंने अपना खुद का छोटा पार्सर लिखा था।

इसका उपयोग करने के लिए स्वतंत्र महसूस करें, लेकिन देखभाल के साथ इसका उपयोग केवल उथल-पुथल परीक्षण किया गया है!

// the exception used by the parser 
class IniParserException extends \Exception { 

    public function __construct($message, $code = 0, \Exception $previous = null) { 
     parent::__construct($message, $code, $previous); 
    } 

    public function __toString() { 
     return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
    } 

} 

// the parser 
function my_parse_ini_file($filename, $processSections = false) { 
    $initext = file_get_contents($filename); 
    $ret = []; 
    $section = null; 
    $lineNum = 0; 
    $lines = explode("\n", str_replace("\r\n", "\n", $initext)); 
    foreach($lines as $line) { 
     ++$lineNum; 

     $line = trim(preg_replace('/[;#].*/', '', $line)); 
     if(strlen($line) === 0) { 
      continue; 
     } 

     if($processSections && $line{0} === '[' && $line{strlen($line)-1} === ']') { 
      // section header 
      $section = trim(substr($line, 1, -1)); 
     } else { 
      $eqIndex = strpos($line, '='); 
      if($eqIndex !== false) { 
       $key = trim(substr($line, 0, $eqIndex)); 
       $matches = []; 
       preg_match('/(?<name>\w+)(?<index>\[\w*\])?/', $key, $matches); 
       if(!array_key_exists('name', $matches)) { 
        throw new IniParserException("Variable name must not be empty! In file \"$filename\" in line $lineNum."); 
       } 
       $keyName = $matches['name']; 
       if(array_key_exists('index', $matches)) { 
        $isArray = true; 
        $arrayIndex = trim($matches['index']); 
        if(strlen($arrayIndex) == 0) { 
         $arrayIndex = null; 
        } 
       } else { 
        $isArray = false; 
        $arrayIndex = null; 
       } 

       $value = trim(substr($line, $eqIndex+1)); 
       if($value{0} === '"' && $value{strlen($value)-1} === '"') { 
        // too lazy to check for multiple closing " let's assume it's fine 
        $value = str_replace('\\"', '"', substr($value, 1, -1)); 
       } else { 
        // special value 
        switch(strtolower($value)) { 
         case 'yes': 
         case 'true': 
         case 'on': 
          $value = true; 
          break; 
         case 'no': 
         case 'false': 
         case 'off': 
          $value = false; 
          break; 
         case 'null': 
         case 'none': 
          $value = null; 
          break; 
         default: 
          if(is_numeric($value)) { 
           $value = $value + 0; // make it an int/float 
          } else { 
           throw new IniParserException("\"$value\" is not a valid value! In file \"$filename\" in line $lineNum."); 
          } 
        } 
       } 

       if($section !== null) { 
        if($isArray) { 
         if(!array_key_exists($keyName, $ret[$section])) { 
          $ret[$section][$keyName] = []; 
         } 
         if($arrayIndex === null) { 
          $ret[$section][$keyName][] = $value; 
         } else { 
          $ret[$section][$keyName][$arrayIndex] = $value; 
         } 
        } else { 
         $ret[$section][$keyName] = $value; 
        } 
       } else { 
        if($isArray) { 
         if(!array_key_exists($keyName, $ret)) { 
          $ret[$keyName] = []; 
         } 
         if($arrayIndex === null) { 
          $ret[$keyName][] = $value; 
         } else { 
          $ret[$keyName][$arrayIndex] = $value; 
         } 
        } else { 
         $ret[$keyName] = $value; 
        } 
       } 
      } 
     } 
    } 

    return $ret; 
} 

इसे दूसरे तरीके से करता है क्या? परिवर्तनीय नामों में केवल अल्फान्यूमेरिकल वर्ण हो सकते हैं लेकिन इसके अलावा उनके लिए कोई प्रतिबंध नहीं है। तार के साथ "सब कुछ no, yes, true, false, on, off, null या none की तरह एक विशेष मूल्य हो गया है समझाया जाना चाहिए। मानचित्रण के लिए कोड देखें।

0

मैं एक ही समस्या में भाग गया और हर संभव तरीके से नाम से बचने की कोशिश की।

तब मैं याद आया कि INI वाक्य रचना की वजह से दोनों के नाम और मान छंटनी किया जाएगा, ताकि निम्न वैकल्पिक हल शायद चाल करना चाहिए:

NL = Netherlands 
; A whitespace before the name 
NO = Norway 
PL = Poland 

और यह काम करता है;) अपने सहकर्मियों के रूप में जब तक टिप्पणियां पढ़ें (जो हमेशा मामला नहीं है) और इसे गलती से हटाएं नहीं। तो, हाँ, सरणी फ़्लिपिंग समाधान एक सुरक्षित शर्त है।