我在INI文件中有以下内容:
[country]
SE = Sweden
NO = Norway
FI = Finland
但是,当var_dump()使用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”的变量?
答案 0 :(得分:4)
另一个黑客就是用他们的值反转你的ini键并使用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"];
如果你这样做,你还需要在NO(至少)周围使用引号
Norway = NO
您没有收到错误,但$ countries [“NO”]的值将为空字符串。
答案 1 :(得分:3)
这可能有点晚了,但PHPs parse_ini_file的工作方式让我非常困扰,以至于我编写了自己的小解析器。
随意使用它,但小心使用它只是经过浅层测试!
// 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;
}
它有什么不同?变量名称可能只包含字母数字字符,但不限于它们。字符串必须用&#34;封装。其他一切都必须是特殊值,例如no
,yes
,true
,false
,on
,off
,null
或none
。对于映射,请参阅代码。
答案 2 :(得分:2)
有点像黑客,但你可以在关键名称周围添加反引号:
[country]
`SE` = Sweden
`NO` = Norway
`FI` = Finland
然后像这样访问它们:
$result = parse_ini_file('test.ini');
echo "{$result['`NO`']}\n";
输出:
$ php test.php
Norway
答案 3 :(得分:0)
当字符串中有单引号组合时,我收到此错误,例如&#39; t或&#39; s。为了摆脱这个问题,我用双引号包装了字符串:
在:
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"
答案 4 :(得分:0)
我遇到了同样的问题,试图以各种可能的方式逃避这个名字。
然后我记得因为INI语法将修剪名称和值,因此以下解决方法MAYBE应该可以解决这个问题:
NL = Netherlands
; A whitespace before the name
NO = Norway
PL = Poland
它有效;)只要您的同事阅读评论(并非总是如此)并且不会意外删除它。所以,是的,阵列翻转解决方案是一个安全的选择。
答案 5 :(得分:-1)