解析“高级”使用 PHP 的 INI 文件
基本上,我想要一种简单、容易、单文件的方法来解析具有“高级”功能的 INI 文件,例如节继承和属性嵌套,例如 Zend_Config_Ini。
例如:
[foo]
a = 1
b.a = 2
b.b = 3
b.c = 4
c = 5
[bar : foo]
b.b = 17
c = 42
将解析为
array(
'foo'=>array(
'a'=>'1',
'b'=>array(
'a'=>'2',
'b'=>'3',
'c'=>'4'
),
'c'=>'5'
),
'bar'=>array(
'a'=>'1',
'b'=>array(
'a'=>'2',
'b'=>'17',
'c'=>'4'
),
'c'=>'42'
)
)
PHP 的内置 parse_ini_file
,除了具有简单部分和简单键的简单 INI 之外,不处理任何其他内容。
我使用 Zend_Config_Ini 的问题是,我必须包含几乎整个 Zend_Config 子包,并且非常臃肿且可配置。
是否有一个小型且简单的库可用于解析此内容?
如果没有,是否有一个我没有看到的简单实现?
我所说的“小而简单”是指类似 INI 文件的 sfYaml 之类的东西。
在我(非常缺乏经验)的眼中,我必须使用 parse_ini_file
解析一次,然后返回并解析继承,然后运行每个部分并递归地扩展键...
更新< /strong>:由于这似乎是一个流行的问题,我想指出 我有一个简单的类在GitHub,随时发送拉取请求、问题等。
Basically, I would like a simple, easy, one-file way to parse an INI file with "advanced" features, like section inheritance and property nesting, like Zend_Config_Ini.
For example:
[foo]
a = 1
b.a = 2
b.b = 3
b.c = 4
c = 5
[bar : foo]
b.b = 17
c = 42
Would parse into
array(
'foo'=>array(
'a'=>'1',
'b'=>array(
'a'=>'2',
'b'=>'3',
'c'=>'4'
),
'c'=>'5'
),
'bar'=>array(
'a'=>'1',
'b'=>array(
'a'=>'2',
'b'=>'17',
'c'=>'4'
),
'c'=>'42'
)
)
PHP's built-in parse_ini_file
, doesn't handle anything other than simple INI's with simple sections and simple keys.
My problem with using Zend_Config_Ini
is that I would have to include virtually the whole Zend_Config subpackage, and is super-bloated and configurable.
Is there a small and simple library available to parse this?
If not, is there an easy implementation I'm not seeing?
By small and simple, I mean something like the sfYaml of INI files.
To my (very inexperienced) eyes, I would have to parse through once with parse_ini_file
, then come back and resolve inheritance, then run through each section and expand the keys recursively...
UPDATE: Since this seems to be a popular question, I would like to note that I have a simple class implementing this on GitHub, feel free to send pull requests, issues, etc.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不确定我是否应该编辑旧答案或添加新答案。
尝试一下这个版本,应该就是您要找的。
可以这样调用:
这可以做得更好/更清晰,但对于一个简单的解决方案来说,它应该工作得很好。
如果您的配置是:
输出应该是:
Not sure if I should edit my old answer or add a new one.
Try this version of it, should be what you're looking for.
Would be called like this:
This could be done a lot better/clearer but for a simple solution it should work just fine.
If your config is:
The output should be:
首先回答一件事,属性嵌套可以从 parse_ini_file() 获得,将第二个参数设置为 true ,即 parse_ini_file('test.ini', true);这将为您提供一个多维数组,即
这是一个小函数,它将解析 parse_ini_file() 返回的数组并将其转换为类别。
它将返回:
最后一次写入获胜,即
[bar2:foo2:bar:foo]
bar2 以其自己的数组中的设置获胜
注意:其他 3 个数组到那时都会存在。
希望这就是您正在寻找的。
First to answer one thing, property nesting is avilable from parse_ini_file(), set the second param to true i.e parse_ini_file('test.ini', true); That will give you a multidimensional array i.e
Here is a small function that will parse the array returned by parse_ini_file() and turn it into categories.
It will return this:
Last write wins i.e
[bar2 : foo2 : bar : foo]
bar2 wins with it's settings in it's own array
NOTE: the other 3 arrays WILL be there up to that point.
Hope this was what you were looking for.
我写了这样的东西,现在它对我来说工作正常:
I've wrote something like this and for now it's working ok for me:
另一种选择 - 这是配对、构建和解析。
Another option - this is the pair, build and parse.