我有一个看起来有点像这样的配置文件
Blah
Diddel
Foo
Bar1
Bar2
One
XXY
Password%1 = something
Password%2 = other
Password%3 = nuffing
Completely different stuff here
RandomS6}=2
User%1 = Henry
User%2 = Marcus
User%3 = SecretAdmin
More stuff
Even more stuff
Loads of stuff
这是用户通过PHP表单上传的config.conf文件。我想阅读该文件并从中创建5个新文件,如下所示:
现在我可以处理的字符串匹配,正则表达式会很甜,但因为它是一个严格格式的配置,我可以用它来提取
while (substr($line,0,5) == "Passw" { ...
我无法理解的是结构方式。 我从嵌套的if循环开始,但是a)让我感到非常低效('User ...'块之后的每一行仍然被'密码......'测试)和b)它不仅看起来很混乱它是也是调试的噩梦。
必须有一个聪明的方法来做到这一点?我想它就像处理牌一样 - “从甲板上开始,将卡片塞入这一堆直到'x'发生,然后将卡片塞入另一堆,直到'y'发生等等。”但是我不能让程序员深入了解它。
我已经做了相当多的谷歌搜索并在这里 - 但我得到的页面告诉我如何分割逗号,或按行数分割,但没有教程分离语义,就像它一样?
非常感谢任何提示!
P.S。 - 如果有更适合该角色的东西,则不必是PHP。但我是Ruby的初学者,也是Python的宝贝 - 我知道PHP比其他任何东西都好。
答案 0 :(得分:0)
我选择的方法,分四步进行分区:
.conf
变量/分隔符并存储它们(密码,
用户,XXY)以下是代码:
$matches = [];
$string = preg_replace_callback(
'~^(?>User.+|Password.+|XXY)$~m',
function ($match) use (&$matches) {
@$matches[substr($match[0], 0, 4)] .= $match[0];
return null;
},
$input
);
print_r(array_merge($matches, preg_split('/^\s+$/m', $string)));
结果有点讨厌而且不完全有序(要做更多工作),但你有你想要的东西( Live demo ):
Array
(
[XXY] => XXY
[Pass] => Password%1 = something
Password%2 = other
Password%3 = nuffing
[User] => User%1 = Henry
User%2 = Marcus
User%3 = SecretAdmin
[0] => Blah
Diddel
Foo
Bar1
Bar2
One
[1] =>
Completely different stuff here
RandomS6}=2
[2] =>
More stuff
Even more stuff
Loads of stuff
)