将文件拆分为php

时间:2016-06-25 15:30:41

标签: php regex process split logic

我有一个看起来有点像这样的配置文件

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个新文件,如下所示:

  1. 从开始到包括XXY行的所有行
  2. 所有'密码%...'行
  3. 最后一个'密码...'与第一个'用户...'行
  4. 之间的行
  5. 所有'用户...'行
  6. “用户......”行下方的所有内容
  7. 现在我可以处理的字符串匹配,正则表达式会很甜,但因为它是一个严格格式的配置,我可以用它来提取

    while (substr($line,0,5) == "Passw" { ...

    我无法理解的是结构方式。 我从嵌套的if循环开始,但是a)让我感到非常低效('User ...'块之后的每一行仍然被'密码......'测试)和b)它不仅看起来很混乱它是也是调试的噩梦。

    必须有一个聪明的方法来做到这一点?我想它就像处理牌一样 - “从甲板上开始,将卡片塞入这一堆直到'x'发生,然后将卡片塞入另一堆,直到'y'发生等等。”但是我不能让程序员深入了解它。

    我已经做了相当多的谷歌搜索并在这里 - 但我得到的页面告诉我如何分割逗号,或按行数分割,但没有教程分离语义,就像它一样?

    非常感谢任何提示!

    P.S。 - 如果有更适合该角色的东西,则不必是PHP。但我是Ruby的初学者,也是Python的宝贝 - 我知道PHP比其他任何东西都好。

1 个答案:

答案 0 :(得分:0)

我选择的方法,分四步进行分区:

  1. 匹配已知的.conf变量/分隔符并存储它们(密码,     用户,XXY)
  2. 替换匹配的字符串(省略)
  3. 将新修改的字符串拆分为
  4. 部分
  5. 合并(1)和(3)
  6. 以下是代码:

    $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
    )