可以在parse_ini_file配置文件中使用数学吗?

时间:2014-11-14 15:47:00

标签: php parsing

可以在parse_ini_file配置文件中使用math吗?如果没有,是否有推荐的解决方法?

$ini = parse_ini_file("config.ini");

的config.ini

MAX_FILE_SIZE  =   100*pow(2,20)   ;100 MB

3 个答案:

答案 0 :(得分:0)

我不相信这是可行的,也可能是推荐的。但是,你可以做的一件事就是解决方法,但遗憾的是,首先使用配置文件的实际价值是使用常量:

define( 'MAX_FILE_SIZE' , 100*pow(2,20) );

然后在ini文件中使用常量。

答案 1 :(得分:0)

我找到了解决方法!

$a = parse_ini_file('a.ini', false, INI_SCANNER_RAW); 

来自PHP doc:

If INI_SCANNER_RAW is supplied, then option values will not be parsed.

因此,您可以收集整个数组,然后创建一个foreach循环,并对值使用eval

检查我的代码:(知道错误,不删除eval_next_line,但现在我必须去。周一我会解决这个问题。直到那个,如果你有时间的话,你也可以修复它。无论如何,回合发生。是的,错误是,我有两次eval_next_line键,所以我需要修复它。无论如何,星期一。)

define('EVAL_NEXT_LINE', 'eval_next_line');

//Default removing the eval_next_lines
$removeEvals = true;
$options = parse_ini_file('a.ini', false, INI_SCANNER_RAW);
if (array_key_exists("remove_evals", $options)) {
    if (empty($options['remove_evals']) || strtolower($options['remove_evals']) == 'no') {
        $removeEvals = false;
    }
}

$i = 0;
$evalNextLine = false;
foreach ($options as $key => $value) {
    if ($evalNextLine === true) {
        $options[$key] = eval("return " . $value .";");
        $evalNextLine = false;
    }
    if ($key == EVAL_NEXT_LINE && ($value || strtolower($options[EVAL_NEXT_LINE] = 'yes'))) {
        $evalNextLine = true;
        if ($removeEvals) {
            unset($options[$i]);
            //$i--;
        }
    }
    $i++;
}

var_dump($options);

我的a.ini是:

[Parse options]
remove_evals = 1;


[Somethings]
eval_next_line = true;
myvar = round(2.5);

abc = xyz;

eval_next_line = true;
myvar2 = 100*pow(2,20);

[Somthing others]
anythig = true;

答案 2 :(得分:0)

您在ini文件中给出的数学运算会因为您使用保留字符(?{}|&~![()^")而引发错误。一个解决方法,虽然“有风险”(因为使用eval()),但是;

的config.ini

MAX_FILE_SIZE  = 100*2;
MAX_FILE_SIZE_POW = 20;

PHP脚本

$ini = parse_ini_file('config.ini');
eval('$base = '. $ini['MAX_FILE_SIZE'] .';');
eval('$ini["MAX_FILE_SIZE"] = '.  bcpow( $base, $ini['MAX_FILE_SIZE_POW'], 2) .';');
echo sprintf("%f", $ini['MAX_FILE_SIZE']);

<强>缺点

  • 使用eval()
  • 您需要两个单独的配置

我们正在使用sprintf,因此我们可以控制输出。没有它我们会得到1.048576E+46